c# - WPF DataGrid 未在 PropertyChanged 上更新

标签 c# wpf data-binding wpfdatagrid inotifypropertychanged

我在使用 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>

我的数据和 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());
    }
}
}

我不知道问题出在哪里。如果有人可以帮助解决我的问题,我将不胜感激。

最佳答案

在您的代码隐藏 .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}"/>

关于c# - WPF DataGrid 未在 PropertyChanged 上更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12329208/

相关文章:

c# - WPF 剪贴板操作期间的数据丢失

c# - 为什么绑定(bind)到转换完全有效?

c# - WPF ListBox 绑定(bind)首先起作用,但之后不起作用

JSF 与 setValueExpression 的绑定(bind)是只读的吗?

c# - 如何修改反序列化对象

c# - WPF 绑定(bind)列表框主/细节

c# - 如何提高加载大量记录到 WPF 下拉列表的性能?

c# - 为服务器和客户端使用不同的加密库

c# - Internet Explorer - 通过客户端 Java 或 C# 代码设置 session Cookie 来指定 JSessionID

c# - 从网络摄像头获取图像