当itemsource以编程方式更改时,我无法成功更新我的WPF Datagrid。
XAML
<DataGrid Name="ReaderGrid" ItemsSource="{Binding myData}" Height="Auto" Width="Auto" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False" IsReadOnly="True" GridLinesVisibility="None">
<DataGrid.Columns>
<DataGridTextColumn Header="Count" Width="*" FontSize="14" Binding="{Binding count}" />
<DataGridTextColumn Header="Total" Width="*" FontSize="14" Binding="{Binding total}" />
</DataGrid.Columns>
</DataGrid>
XAML.CS(代码隐藏)
public partial class MainWindow : Window
{
public ObservableCollection<obj> myData { get; set; }
public MainWindow()
{
InitializeComponent();
myData = new ObservableCollection<obj>();
InitializeMyData();
最后一个函数(InitializeMyData())只用测试信息填充myData。
最后,对象只是一些测试类
public class obj
{
public int count { get; set; }
public double total { get; set; }
}
代码AS-IS不起作用,除了WPF中的数据网格为空之外没有任何错误 - 我发现修复此问题的唯一方法是在初始化数据后添加以下内嵌代码
ReaderGrid.ItemsSource = myData;
现在显示我的所有初始数据,除了在此之后的任何时间点,如果我更改myData,我希望/期望更改能够自动反映在我的WPF Datagrid中,遗憾的是没有任何更新......
问题 - 为什么我的WPF绑定不起作用(为什么我需要在ItemSource的代码后面显式设置),以及为什么myData的更改没有更新我的Datagrid?
谢谢,
答案 0 :(得分:6)
像
这样的绑定ItemsSource="{Binding myData}"
没有显式定义绑定的源对象,而是源属性。它要求设置绑定目标的DataContext,然后将其用作源对象。
DataContext继承自父元素到子元素,并且通常设置在窗口的构造函数中,如下所示。
这是MainWindow实例,因为MainWindow类拥有source属性,但通常它是视图模型类的一个实例,它声明了绑定源属性(并且还实现了INotifyPropertyChanged接口以通知属性值更改) )。
public ObservableCollection<obj> myData { get; } = new ObservableCollection<obj>();
public MainWindow()
{
InitializeComponent();
InitializeMyData();
DataContext = this;
}
另请注意,根据广泛接受的编码约定,C#属性名称以大写字母开头,因此最好将您的属性命名为MyData
。
对于您的第二个问题,即不更新的数据,您的数据项类必须实现INotifyPropertyChanged
界面,例如:
public class obj : INotifyPropertyChanged
{
public event PropertyChanged;
private int _count;
public int Count
{
get { return _count; }
set
{
_count = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count"));
}
}
}
有关WPF数据绑定的所有详细信息,请参阅MSDN上的Data Binding Overview文章。