首页 > 解决方案 > WPF Datagrid 不更新

问题描述

关于我绑定到 ObservableCollection 的 WPF 数据网格,我有一个(很可能)非常简单的问题,不幸的是,当我将项目添加到此集合时它不会更新。

这是我的观点,包括。数据网格:

<UserControl.Resources>
    <local:SinglePackTransactions_ViewModel x:Key="vm"/>
</UserControl.Resources>
...
...
...
    <DataGrid x:Name="DataGridRequestPacks_SinglePack" AutoGenerateColumns="False" Grid.Row="1" Width="700" Margin="30"
                      ItemsSource="{Binding SinglePackResultList, Source={StaticResource vm}}" IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Created" Width="Auto" Binding="{Binding Created}"/>
            <DataGridTextColumn Header="Product Code" Width="Auto" Binding="{Binding ProductCode}"/>
        </DataGrid.Columns>
    </DataGrid>

当我单击一个按钮 (Command="SendRequestCmd") 时,我将我的自定义类 ("Pack") 的一项添加到我的 ObservableCollection SinglePackResultList。在我的 ViewModel 的构造函数中,我在这里有这个:

SinglePackResultList = new ObservableCollection<Pack>();

SendRequestCmd = new RelayCommand((object z) =>
{
    try
    {
        SinglePackResultList.Add(SOAPRequest.SOAPRequestHandler(new Pack() {Created = (DateTime.Now).ToShortDateString(), ProductCode = ProductCode_SinglePack, BatchID = BatchID_SinglePack, BatchExpiry = BatchExpiry_SinglePack, PackSerialnumber = SerialNumber_SinglePack, PackTransaction = Transaction_SinglePack.TransactionID }));
    }
    catch (Exception)
    {
        return;
    }
},
CanExecute);

当我设置调试点时,我可以看到在每次单击按钮后,我的 ObservableCollection SinglePackResultList 中都会有其他项目 - 所以这有效。但不幸的是,Datagrid 保持为空。我尝试在NotifyPropertyChanged("SinglePackResultList")之后直接添加一个SinglePackResultList.Add(...),但这也不起作用。

我完全迷失了如何让这个工作。:-(

标签: c#wpfdatagridwpfdatagridinotifypropertychanged

解决方案


在 WPF 中处理数据绑定的两种方法。

在构造函数中创建并且永远不要更改它。例如

public class A{
    public ObservableCollection<int> ObserableList { get; set; }

    public A() { ObservableList = new ObservableCollection<int>(); }
}

那么您只需添加或删除集合中的元素。

或者您可以使用完整的属性和事件PropertyChanged,这样您就可以为其分配另一个集合。

public class A {
    private ObservableCollection<int> observableList;

    public ObservableCollection<int> ObservableList
    {
        get { return observableList; }
        set
        {
            observableList = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ObservableList));
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void Init() 
    {
        ObservableList = new ObservableCollection<int>();
    }
}

推荐阅读