C# WPF数据网格不更新
关于我绑定到ObservableCollection的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
<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);