2012-09-08 55 views
6

我在使用NotifyPropertyChanged单击按钮时更新我的​​数据网格时遇到问题。 它工作,如果我在后面的代码中设置DataGrid.ItemsSource,但它不会如果我在xaml中设置它。 这里的背后& XAML代码的一些代码:WPF DataGrid不在PropertyChanged上更新

namespace MyWpfDataBindingLab 
{ 
public partial class NpcWindow : Window 
{ 
    DataCollection dc = new DataCollection(); 

    public NpcWindow() 
    { 
     InitializeComponent(); 
     //command binding code 
     //... 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     //if i set the ItemsSource here, updating of the UI works 
     //dataGrid1.ItemsSource = dc; 
    } 

    private void CmdCollectionChangedExecute(object sender, ExecutedRoutedEventArgs e) 
    { 
     foreach (SampleClass s in dc) 
     { 
      s.Property1 = "changed"; 
      s.Property3 = "changed"; 
      s.Property3 = "changed"; 
      break; 
     } 

     dc.Add(new SampleClass("new sample 1", "new sample 2", "new sample 3")); 
    } 
} 
} 

<Window x:Class="WPFDataBinding.NpcWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:npc="clr-namespace:WPFDataBinding.NotifyPropChanged" 
    Title="MainWindow" Height="189" Width="459" Loaded="Window_Loaded"> 
<Window.Resources> 
    <npc:DataCollection x:Key="dataCol"/> 
</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
    </Grid.ColumnDefinitions> 
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="349,110,0,0" Name="button1" VerticalAlignment="Top" Width="75" /> 
    <!-- if i set the ItemsSource here, updating of the UI doesn't work --> 
    <DataGrid ItemsSource="{Binding Source={StaticResource dataCol}, Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
       AutoGenerateColumns="True" Height="103" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="331" /> 
</Grid> 

我的数据& NotifyPropertyChanged实现:

namespace MyWpfDataBindingLab.NotifyPropChanged 
{  
public class SampleClass : NotifyPropertyChanged 
{ 
    private string _field1; 
    private string _field2; 
    private string _field3; 

    public string Property1 
    { 
     get { return _field1; } 
     set 
     { 
      _field1 = value; 
      OnPropertyChanged("Property1"); 
     } 
    } 

    public string Property2 
    { 
     get { return _field2; } 
     set 
     { 
      _field2 = value; 
      OnPropertyChanged("Property2"); 
     } 
    } 

    public string Property3 
    { 
     get { return _field3; } 
     set 
     { 
      _field3 = value; 
      OnPropertyChanged("Property3"); 
     } 
    } 

    public SampleClass() 
    { 
     _field1 = "value1"; 
     _field2 = "value2"; 
     _field3 = "value3"; 
    } 

    public SampleClass(string p1, string p2, string p3) 
    { 
     _field1 = p1; 
     _field2 = p2; 
     _field3 = p3; 
    } 
} 
} 

namespace MyWpfDataBindingLab.NotifyPropChanged 
{ 
public abstract class NotifyPropertyChanged : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
} 

namespace MyWpfDataBindingLab.NotifyPropChanged 
{ 
public class DataCollection : ObservableCollection<SampleClass> 
{ 
    public DataCollection() 
    { 
     this.Add(new SampleClass()); 
     this.Add(new SampleClass()); 
     this.Add(new SampleClass()); 
    } 
} 
} 

我不知道是什么问题。如果有人能帮助解决我的问题,我会很感激。

+0

您是否有任何实际上将项目添加到'DataCollection'实例的代码?如果不添加任何内容,则CmdCollectionChangedExecute处理程序不会触发。 – slugster

+0

单击该按钮时,集合将通过CmdCollectionChangedExecute进行更新。方法名称有点混乱。它应该是CmdCollectionChangeExecute。更新工作正常,但只有在后台代码中设置了ItemsSource时,UI才会更新。我喜欢只在xaml文件中做到这一点。 – nllpntr

回答

9

在您的代码隐藏.xaml.cs创造财产

public ObservableCollection<SampleClass> MyCollection {get; set;} 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
    //if i set the ItemsSource here, updating of the UI works 
     dataGrid1.ItemsSource = MyCollection; 
    } 

在XAML:

<DataGrid ItemsSource="{Binding Path=., Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"/> 
+0

感谢您的快速回答。你的代码运行良好。是否有可能摆脱dataGrid1.ItemsSource = MyCollection;在代码后面,并在xaml中完成绑定? – nllpntr

+0

你可以使用this.DataContext = MyCollection; – syned

+0

谢谢!这正是我所寻找的 - 很好地解决了我的问题。 – Fred

7

我跟进syned的小费。对我来说,我不得不给我们的模式为

Mode=TwoWay 

这里的关键是

UpdateSourceTrigger 

财产。

非常感谢...!