简体   繁体   English

WPF DataGrid 未在 PropertyChanged 上更新

[英]WPF DataGrid not updating on PropertyChanged

i've a problem updating my datagrid when clicking the button by using NotifyPropertyChanged.使用 NotifyPropertyChanged 单击按钮时,我在更新数据网格时遇到问题。 It works if i set the DataGrid.ItemsSource in code behind, but it doesn't if i set it in xaml.如果我在后面的代码中设置了 DataGrid.ItemsSource,它会起作用,但如果我在 xaml 中设置它,它就不起作用。 here's some code of code behind & 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>

my data & NotifyPropertyChanged implementation:我的数据和 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());
    }
}
}

i have no idea what the problem is.我不知道问题是什么。 i'd appreciate it if someone can help solving my problem.如果有人可以帮助解决我的问题,我将不胜感激。

In your codebehind .xaml.cs create property在您的代码隐藏 .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;
   }

In XAML:在 XAML 中:

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

I followed up on syned's tip.我跟进了赛尼德的提示。 For me I had to us the Mode as对我来说,我不得不把我们的模式作为

Mode=TwoWay

The key here was the这里的关键是

UpdateSourceTrigger

property.财产。

Thanks a lot...!非常感谢...!

When you go crazy (like me) because it doesn't work this time (while it always worked!) Check the order of the calls.当你发疯时(像我一样)因为这次它不起作用(虽然它总是起作用!)检查调用顺序。 The OnPropertyChanged() must be called after the value was assigned. OnPropertyChanged() 必须在赋值后调用。

public string Property1
{ 
    get { return _field1; } 
    set 
    {
        // assign the value first ...
        _field1 = value;

        // ... then call the property changed
        OnPropertyChanged(nameof(Property1));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM