我对WPF数据绑定有点困惑。我已经尝试了很多例子,但我认为我不理解这个主题的基础知识。
我有以下datagrid,绑定到ObservableCollection(Of T),其中T类有一个Name属性,显示在datagrid列中。我的T类还实现了INotifyPropertyChanged,并在Name属性更改时正确触发事件。
<DataGrid Grid.Row="1" Name="MyDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding}" >
<DataGrid.Columns>
<DataGridTextColumn x:Name="NameColumn" Header="Name" Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
然后,在代码隐藏类中,我有基础集合,它正在为数据网格提供数据。
public ObservableCollection<T> MyCollection
{
get;
set;
}
最后,当我的应用程序启动时,我加载“MyCollection”属性并告诉datagrid使用该集合。
public void InitApp()
{
MyCollection = [... taking data from somewhere ...];
MyDataGrid.ItemsSource = MyCollection;
}
这一切都正常(数据显示正确)。但是,如果我重新加载集合(从某处获取完全不同的数据),如果我不再执行MyDataGrid.ItemsSource = MyCollection;指令,数据网格不会更新。
我认为每次重新加载数据时使用XXX.ItemsSource = YYY都不是一个好习惯,所以我猜我做错了。在一些示例中,我看到XAML DataGrid绑定为:
<DataGrid ItemsSource="{Binding CollectionName}">
...
</DataGrid>
我的目标是使用该集合,因此无需以编程方式执行.ItemsSource ...但我无法使其运行。
有人能告诉我隧道尽头的光吗?
答案 0 :(得分:1)
您可以对DataGrid的ItemsSource
进行数据绑定,而不是手动分配。只需将MyCollection
声明为公共属性,正确提出PropertyChanged
通知,并为DataContext
设置DataGrid
(或为DataGrid所在的Window设置DataContext
):
private ObservableCollection<MyClass> _myCollection
public ObservableCollection<MyClass> MyCollection
{
get { return _myCollection; }
set
{
_myCollection = value;
NotifyPropertyChanged("MyCollection");
}
}
public void InitApp() {
MyCollection = [... taking data from somewhere ...];
MyDataGrid.DataContext = this;
}
<DataGrid ItemsSource="{Binding MyCollection}">
...
</DataGrid>
更新:
您的方法也在XAML中声明绑定:
<DataGrid Grid.Row="1" Name="MyDataGrid"
AutoGenerateColumns="False"
ItemsSource="{Binding}" >
这应该可以在不设置ItemsSource
的情况下工作,但将其DataContext设置为集合:
public void InitApp() {
MyCollection = [... taking data from somewhere ...];
MyDataGrid.DataContext = MyCollection;
}
理论上(因为我没有专门尝试过这个问题的场景),只要ItemsSource
绑定你的DataGrid就会在收集重新加载时自动更新,当手动设置ItemsSource
时不能带来同样的效果
答案 1 :(得分:0)
您没有解释最重要的部分,即如何实施填充?如果你通过为旧变量分配新的集合引用来实现它,那么它将无法工作,因为集合是一种引用类型,无论如何解决你的问题,你可以做两件事之一(除了你的解决方案): 第一种是在窗口中将ObservableCollection定义为Dependency属性,然后就可以使用它了。 第二个也是最简单的方法是清除集合,然后使用源集合中的foreach循环添加新项目 这是第一种情况的例子:
public static readonly DependencyProperty MyCollectionProperty = DependencyProperty.Register("MyCollection", typeof(ObservableCollection<T>), typeof(MainWindow));
public ObservableCollection<T> MyCollection
{
get
{
return this.GetValue(MyCollectionProperty) as string;
}
set
{
this.SetValue(MyCollectionProperty, value);
}
}
//assign the collection value at any time
MyCollection = ......
//you can bind it as the past