使用NotifyPropertyChanged单击按钮时,我在更新数据网格时遇到问题。 如果我在代码中设置DataGrid.ItemsSource,它可以工作,但如果我在xaml中设置它,它就不会。 这里有一些代码和& XAML:
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>
我的数据&amp; 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 :(得分:12)
在你的代码隐藏.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}"/>
答案 1 :(得分:8)
我跟进了syned的提示。对我来说,我必须把模式作为
Mode=TwoWay
这里的关键是
UpdateSourceTrigger
属性。
非常感谢......!
答案 2 :(得分:0)
当你发疯时(像我一样),因为这次不起作用。检查呼叫顺序。赋值后必须调用OnPropertyChanged()。
public string Property1
{
get { return _field1; }
set
{
// assign the value first
_field1 = value;
// then call the property changed
OnPropertyChanged("Property1");
}
}