WPF DataGrid绑定混乱

时间:2014-02-27 09:50:03

标签: c# wpf xaml binding datagrid

我对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 ...但我无法使其运行。

有人能告诉我隧道尽头的光吗?

2 个答案:

答案 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