2013-09-23 11 views
0

У меня есть приложение wpf, и я хочу обновить свой список, когда я изменяю значение через пользовательский интерфейс с помощью Observablecollect. Но я не понимаю, чего я ожидаю. Когда я изменю значение, я не буду обновлять свой список. View Code (Xaml)WPF MVVM и Observablecollect

<UserControl x:Class="DataWatch.View.CompareData" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:ViewModels="clr-namespace:DataWatch.ViewModel" 
     mc:Ignorable="d" 
     d:DesignHeight="340" d:DesignWidth="600"> 
<UserControl.DataContext> 
    <ViewModels:CompareViewModel/> 
</UserControl.DataContext> 
<Grid> 
    <ListView HorizontalAlignment="Left" Name="comparelistview" VerticalAlignment="Top" Width="600" Height="340" ItemsSource="{Binding DisplayData}"> 
     <ListView.View> 

      <GridView> 
       <GridViewColumn Width="150" Header="Key" 
        DisplayMemberBinding="{Binding Path=Key}" /> 
       <GridViewColumn Width="150" Header="Project Data" 
        DisplayMemberBinding="{Binding Path=ProjectData}" /> 
       <GridViewColumn Width="150" Header="Import Data" 
        DisplayMemberBinding="{Binding Path=ImportData}"/> 
       <GridViewColumn Width="150" Header="State" 
        DisplayMemberBinding="{Binding Path=State}"/> 


      </GridView> 
     </ListView.View> 
    </ListView> 

</Grid> 

ViewModel

namespace DataWatch.ViewModel 
    { 

    public class CompareViewModel 
    { 
     private ObservableCollection<CompareDiplayData> _displayData; 

     public CompareViewModel() 
     { 
       _displayData = new ObservableCollection<CompareDiplayData>(); 

     } 
       public ObservableCollection<CompareDiplayData> DisplayData 
     { 
      get { return _displayData; } 
     } 
    } 

Модель:

namespace DataWatch.Model 
    { 
    public class CompareDiplayData : INotifyPropertyChanged 
    { 
     private string _key; 
     public string Key 
     { 
      set 
      { 
       _key = value; 
       this.Changed("Key"); 
      } 
      get 
      { 
       return _key; 
      } 
     } 
     private string _projectData; 

     public string ProjectData 
     { 
      set 
      { 
       _projectData = value; 
       this.Changed("ProjectData"); 
      } 
      get 
      { 
       return _projectData; 
      } 
     } 
     private string _importData; 

     public string ImportData 
     { 
      set 
      { 
       _importData = value; 
       this.Changed("ImportData"); 
      } 
      get 
      { 
       return _importData; 
      } 
     } 
     private string _state; 
     public string State 
     { 
      set 
      { 
       _state = value; 
       this.Changed("State"); 
      } 
      get 
      { 
       return _state; 
      } 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
     private void Changed(string PropertyName) 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
     } 
    } 

} 

При изменении значения в displayData, но ListView не будет обновлять данные. выпадающий контроль вид

<UserControl x:Class="DataWatch.View.SelectPanel" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:ViewModels="clr-namespace:DataWatch.ViewModel" 
     xmlns:AttachProperty="clr-namespace:DataWatch.AttachedProperty" 
     mc:Ignorable="d" 
     d:DesignHeight="30" d:DesignWidth="600"> 
<UserControl.DataContext> 
    <ViewModels:CompareViewModel/> 
</UserControl.DataContext> 
<Grid Name="good"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="150"> 
     </ColumnDefinition> 
     <ColumnDefinition Width="300"> 
     </ColumnDefinition> 
     <ColumnDefinition Width="150"> 

     </ColumnDefinition> 
    </Grid.ColumnDefinitions> 

    <ComboBox Height="23" HorizontalAlignment="Left" Grid.Column="0" Grid.Row="0" Margin="15,4,6,4" x:Name="KeyComboBox" VerticalAlignment="Top" Width="120" Text="Choose Key" AttachProperty:SelectionBehavior.SelectionChanged="{Binding SelectKeyCmd}" SelectedItem="{Binding SelectedKey, Mode=TwoWay}" ItemsSource="{Binding KeyComboboxItem}" 
     IsEditable="true" IsReadOnly="true" 
     IsDropDownOpen="True" StaysOpenOnEdit="True"/> 
    <ComboBox Height="23" HorizontalAlignment="Left" Grid.Column="1" Grid.Row="0" Margin="90,4,6,4" Name="compareitemcomBox" VerticalAlignment="Top" Width="120" Text="Compare Item" AttachProperty:SelectionBehavior.SelectionChanged="{Binding SelectKeyCmd}" SelectedItem="{Binding SelectedComparedData, Mode=TwoWay}" ItemsSource="{Binding CompareComboboxItem}" 
     IsEditable="true" IsReadOnly="true" 
     IsDropDownOpen="True" StaysOpenOnEdit="True"/> 
    <ComboBox Height="23" HorizontalAlignment="Left" Grid.Column="2" Grid.Row="0" Margin="15,4,6,4" Name="display" VerticalAlignment="Top" Width="120" Text="Choose State" 
     IsEditable="true" IsReadOnly="true" 
     IsDropDownOpen="True" StaysOpenOnEdit="True"/> 

</Grid> 

Приложить свойству

public class SelectionBehavior 
{ 
    public static DependencyProperty SelectionChangedProperty = 
     DependencyProperty.RegisterAttached("SelectionChanged", 
     typeof(ICommand), 
     typeof(SelectionBehavior), 
     new UIPropertyMetadata(SelectionBehavior.SelectedItemChanged)); 
    public static void SetSelectionChanged(DependencyObject target, ICommand value) 
    { 
     target.SetValue(SelectionBehavior.SelectionChangedProperty, value); 
    } 
    private static void SelectedItemChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     Selector element = target as Selector; 
     if (element == null) throw new InvalidOperationException("This behavior can be attached to Selector item only."); 
     if ((e.NewValue != null) && (e.OldValue == null)) 
     { 
      element.SelectionChanged += SelectionChanged; 
     } 
     else if ((e.NewValue == null) && (e.OldValue != null)) 
     { 
      element.SelectionChanged -= SelectionChanged; 
     } 
    } 
    private static void SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
    { 
     UIElement element = (UIElement)sender; 
     ICommand command = (ICommand)element.GetValue(SelectionBehavior.SelectionChangedProperty); 
     command.Execute(((Selector)sender).SelectedValue); 
    } 

} 

ViewModel

public class CompareViewModel 
{ 
    private readonly ICommand _selectKeyCmd; 
    private List<string> _pro_Property; 
    private List<string> _imp_Property; 
    private string selectedKey; 
    private ObservableCollection<string> compareComboboxItem; 
    private DataTable _dt; 
    private CompareDiplayData domObject; 
    private ObservableCollection<CompareDiplayData> _displayData; 



    public CompareViewModel() 
    { 
           _displayData = new ObservableCollection<CompareDiplayData>(); 
     _selectKeyCmd = new RelayCommand(ComboboxChanged, ComboboxIsChanged); 

    } 
    private void ReslutData() 
    {_displayData =null; 

     if (SelectedKey != null && SelectedComparedData != null) 
     { 
      foreach (DataRow pdr in _projectDt.Rows) 
      { 

       CompareDiplayData cdd = new CompareDiplayData(); 
       foreach (DataRow idr in _importDt.Rows) 
       { 

        if (pdr[SelectedKey].ToString() == idr[SelectedKey].ToString()) 
        { 
         cdd.Key = pdr[SelectedKey].ToString(); 
         cdd.ProjectData = pdr[SelectedComparedData].ToString(); 
         cdd.ImportData = idr[SelectedComparedData].ToString(); 
         if (pdr[SelectedComparedData].ToString() == idr[SelectedComparedData].ToString()) 
          cdd.State = "Match"; 
         else 
          cdd.State = "Mismatch"; 
         _displayData.Add(cdd); 
        } 

       } 


      } 
     } 
    } 
public ObservableCollection<CompareDiplayData> DisplayData 
    { 
     get { return _displayData; } 
    } 
public ICommand SelectKeyCmd 
    { 
     get { return _selectKeyCmd; } 
    } 
    private void ComboboxChanged(object obj) 
    { 
     ReslutData(); 
    } 
    private bool ComboboxIsChanged(object obj) 
    { 
     return true; 
    }`}` 
+0

по изменению вы имеете в виду, что вы создаете новую коллекцию или добавляете элементы в существующую коллекцию? – Nitin

+0

на странице пользовательского интерфейса есть комбобокс, по defaut показать все данные, я могу использовать combobox, чтобы выбрать, какое состояние мне нравится. когда changeitem изменится, я хочу обновить listview –

+0

, поэтому в выборе combobox вы снова создадите экземпляр displayData и заполните его правильно? можете ли вы также поделиться кодом, в котором вы это делаете? – Nitin

ответ

0

Вы обновляете ссылку в Observablecollection здесь, так что должен быть уведомлен как PropertyChange. Чтобы исправить это, вам также нужно будет реализовать INotifyPropertyChanged на вашем ViewModel и написать наборщик DisplayData и изменить его свойство.

 public ObservableCollection<CompareDiplayData> DisplayData 
     { 
      get { return _displayData; } 
      set{_displayData = value; 
       this.Changed("DisplayData"); 
     } 

и в вашем ReslutData functin вместо обновления переменной _displayData, обновить свойство DisplayData.

+0

он не работает. –