关于您绑定到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(...)
,但是效果不佳。
我完全迷失了如何使它工作。 :-(
答案 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);