2012-03-12 1 views
0

Я столкнулся с серьезной проблемой для себя в процессе обучения привязок WPF. Я должен создать приложение, которое использует Listview, который выглядит следующим образом:ListView.SelectedItem BindingtoSource

<ListView.View> 
    <GridView> 
     <GridViewColumn Header="ID" Width="75" DisplayMemberBinding="{Binding ID}" /> 
     <GridViewColumn Header="Name" Width="170" DisplayMemberBinding="{Binding Name}" /> 
     <GridViewColumn Header="Price" Width="100" DisplayMemberBinding="{Binding Price}" /> 
     <GridViewColumn Header="Reseller" Width="Auto" DisplayMemberBinding="{Binding Reseller}" /> 
    </GridView> 
</ListView.View> 

В файле отделенного кода У меня есть свойство:

public Product seletedRow 
{ 
    get { return m_Product; } 
    set { m_Product = value; PropertyChanged("Product"); } 
} 

Цель будет установить это свойство для выбранной строки listView, а затем отобразить поля этого свойства в 4 текстовых файлах. Если я устанавливаю это свойство вручную из кода, я могу отображать информацию в текстовых полях, но я не могу понять, как связать объект с ListView.SelectedItem. Насколько я понял, я должен использовать режим привязки OneWayToSource, но я понятия не имею, как это сделать.

Я также открыта для других решений, пока я могу использовать его в шаблоне MVVM.

+0

Мне ничего не хватает. Пожалуйста, укажите более подробную информацию: что такое ItemsSource (или Items) ListView? Это коллекция продуктов? Что еще у вас есть в модели просмотра? Вы хотите поддержать редактирование коллекции продукта пользователем? Если да, почему бы вам не использовать DataGrid? – Uri

ответ

1

Возможно, лучше сделать что-то подобное. Таким образом, вам даже не нужен код.

{Binding ElementName=myListView, Path=SelectedItem.ID, UpdateSourceTrigger=PropertyChanged} 

Вам необходимо присвоить ListView такое имя.

<ListView Name="myListView"> 

Это будет выглядеть примерно так.

<ListView Name="myListView"> 
    <ListView.View> 
       <GridView> 
        <GridViewColumn Header="ID" Width="75" DisplayMemberBinding="{Binding ID}" /> 
        <GridViewColumn Header="Name" Width="170" DisplayMemberBinding="{Binding Name}" /> 
        <GridViewColumn Header="Price" Width="100" DisplayMemberBinding="{Binding Price}" /> 
        <GridViewColumn Header="Reseller" Width="Auto" DisplayMemberBinding="{Binding Reseller}" /> 
       </GridView> 
      </ListView.View> 
</ListView> 

<TextBox Text="{Binding ElementName=myListView, Path=SelectedItem.ID, UpdateSourceTrigger=PropertyChanged}"/> 

Edit:

Если вы wan't расширить на логике вы, вероятно, хотите, чтобы посмотреть в использовании ACB, как и ACB вы могли бы сделать что-то вроде этого.

acb:CommandBehavior.Event="SelectedItemChanged" 
acb:CommandBehavior.Command="{Binding SelectedItemChanged}" 
acb:CommandBehavior.CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=SelectedItem}" 

Это существенно позволит вам хранить конкретный SelectedItem каждый раз, когда вы выбираете новый пункт в списке.

http://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/

+0

Я знаю, что могу сделать это именно так, НО позже я должен иметь возможность обновлять модель с помощью кнопки. Теперь, если я возьму этот пример и предположим, что у меня есть кнопка, как я могу добавить CommandParameters из текстовых полей? Я не могу сказать, что Path = SelectedItem, потому что это будет старое значение. И я не могу использовать TwoWayBinding, потому что критерием является то, что Listview обновляется только после завершения команды исполнения Button. – Wrath

+0

Вот почему у вас есть PropertyChanged. Вы можете просто вручную обновить «Продукт» в коде, и как «ListView», так и «TextBox» должны получать обновления. Хотя, возможно, вам нужно будет использовать что-то вроде «ICollectionView», чтобы вручную обновить «ListView». – eandersson

+0

Ну, у меня все еще есть следующая проблема: если я выберу элемент в списке, текстовые поля будут содержать необходимые данные. Я изменяю детали продукта в текстовых окнах, !! Я не нажимаю на кнопку !!. Я выбираю другую строку, и предыдущая строка, которая не должна обновляться, сразу обновлялась; однако он должен обновляться только после нажатия кнопки. – Wrath

Смежные вопросы