C# WPF数据网格不更新

C# WPF数据网格不更新,c#,wpf,datagrid,wpfdatagrid,inotifypropertychanged,C#,Wpf,Datagrid,Wpfdatagrid,Inotifypropertychanged,关于我绑定到ObservableCollection的WPF数据网格,我有一个(很可能)非常简单的问题要问您,不幸的是,当我向该集合添加项时,该问题没有更新 这是我的观点,包括数据网格: <UserControl.Resources> <local:SinglePackTransactions_ViewModel x:Key="vm"/> </UserControl.Resources> ... ... ... <DataGrid x:N

关于我绑定到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);
SinglePackResultList=新的ObservableCollection();
SendRequestCmd=新的RelayCommand((对象z)=>
{
尝试
{
SinglePackResultList.Add(SOAPRequest.SOAPRequestHandler(new Pack(){Created=(DateTime.Now).ToSortDateString(),ProductCode=ProductCode\u SinglePack,BatchID=BatchID\u SinglePack,BatchExpire=BatchExpire\u SinglePack,PackSerialnumber=SerialNumber\u SinglePack,PackTransaction=Transaction\u SinglePack.TransactionID});
}
捕获(例外)
{
返回;
}
},
CanExecute);
当我设置一个调试点时,我可以看到在每次单击按钮后,ObservableCollection SinglePackResultList中都会有一个额外的项,所以这是可行的。 但不幸的是,数据网格仍然是空的。我试图在
SinglePackResultList.add(…)
之后直接添加一个
NotifyPropertyChanged(“SinglePackResultList”)
,但效果并不理想


我完全不知道如何才能让它工作-(

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

在构造函数中创建,永远不要更改它

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

    public A() { ObservableList = new ObservableCollection<int>(); }
}
公共A类{
公共observeCollection ObserableList{get;set;}
公共A(){observeList=new observetecollection();}
}
然后只添加或删除集合中的元素

或者您可以使用full属性和event 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>();
    }
}
公共A类{
私人观察收集观察者;
公共观察收集观察列表
{
获取{return observeList;}
设置
{
可观察列表=值;
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(名称)(ObservableList));
}
}
公共事件属性更改事件处理程序属性更改;
私有void Init()
{
ObservableList=新的ObservableCollection();
}
}

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

以下是对我有用的东西——也许这也会帮助其他人:

查看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>
在我的ViewModel中,我只是将ObservableCollection用作属性:

public ObservableCollection<Pack> SinglePackResultList { get; set; }
公共ObservableCollection SinglePackResultList{get;set;} 在ViewModel的构造函数中,我使用绑定的ICommand按钮向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);
SinglePackResultList=新的ObservableCollection();
SendRequestCmd=新的RelayCommand((对象z)=>
{
尝试
{
SinglePackResultList.Add(
SOAPRequest.SOAPRequestHandler(
新包装()
{
ProductCode=ProductCode\u单包,
BatchID=BatchID\u单包,
BatchExpire=BatchExpire\u单包,
PackSerialnumber=SerialNumber\u SinglePack,
PackTransaction=Transaction\u SinglePack.TransactionID
}
)
);
}
捕获(例外e)
{
返回;
}
},
CanExecute);

将其作为属性而不是字段。我有点迷路了。我现在从构造函数中删除了
SinglePackResultList=new ObservableCollection();
。我的内部字段对应。我的属性如下所示:
private ObservableCollection\u SinglePackResultList;public ObservableCollection SinglePackResultList{get{if(_singlePackResultList==null)_singlePackResultList=new ObservableCollection();返回_singlePackResultList;}设置{u singlePackResultList=value;}}
我到底需要更改什么?:-)您应该发布准确的代码,因为这很重要。Wpf绑定通常仅适用于属性。您是否正在创建视图模型的单个实例?大家好,感谢您的大力支持。此问题已解决(请参阅下面的答案)。我的主要错误是,我没有在视图构造函数中将ViewModel分配给视图的DataContext。
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);