WPF Datagrid无法更新

时间:2018-06-24 13:23:46

标签: c# wpf datagrid wpfdatagrid inotifypropertychanged

关于您绑定到ObservableCollection的WPF Datagrid,我有一个(最可能是)一个非常简单的问题,很不幸,当我向该Collection中添加项目时,它并没有更新。

这是我的包含视图Datagrid:

<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(...),但是效果不佳。

我完全迷失了如何使它工作。 :-(

2 个答案:

答案 0 :(得分:1)

在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>();
    }
}

答案 1 :(得分:0)

根据您的反馈,我可以确定我的错误。我忘了设置ViewModel的DataContext并删除了staticresource。

这是对我有用的-也许这也可以帮助其他人:

View-XAML:

<DataGrid x:Name="DataGridRequestPacks_SinglePack" AutoGenerateColumns="False" Grid.Row="1" Width="1150" Margin="30" ItemsSource="{Binding SinglePackResultList}" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Created" Width="Auto" Binding="{Binding Created}"/>
        <DataGridTextColumn Header="Product Code" Width="Auto" Binding="{Binding ProductCode}"/>
    </DataGrid.Columns>
</DataGrid>

View.cs(构造函数):

public SinglePackTransactions_View()
{
    InitializeComponent();
    this.DataContext = new SinglePackTransactions_ViewModel();
}

在我的ViewModel中,我只是将ObservableSollection用作属性:

public ObservableCollection<Pack> SinglePackResultList { get; set; }

在ViewModel的构造函数中,我使用绑定的ICommand-Button将项添加到ObservableCollection中:

SinglePackResultList = new ObservableCollection<Pack>();

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