与对象源的WPF数据绑定无法更新

时间:2010-08-02 21:58:16

标签: wpf data-binding

我一直在努力解决这个问题并阅读了很多,但大多数例子都太简单了。我试图将一个非常简单的ObservableCollection绑定到DataGrid。 Collection中的超级简单对象是“SingleItems”,其定义如下:

public class SingleItem {
private String _name=null;

public String Name {
  get { return _name; }
  set { _name=value; }
}

public SingleItem(String name) {
  Name=name;
}

类ManyItems托管Collection,其定义如下:

public class ManyItems{
private ObservableCollection<SingleItem> allItems=new ObservableCollection<SingleItem>();


public ManyItems() {
  AllItems.Add(new SingleItem("inside"));//debug code
}


public ObservableCollection<SingleItem> AllItems {
  get { return allItems; }
  set { allItems=value; }
}

public void AddItem(SingleItem item) {
  AllItems.Add(item);
}
}

在我的主窗口中,我只想在用户按下按钮时更新ManyItems:

public partial class MainWindow : Window{
int count=0;
ManyItems _items=new ManyItems();

public ManyItems Items {
  get { return _items; }
  set { _items=value; }
}

public MainWindow(){
this.InitializeComponent();
}

private void Button_Click(object sender, System.Windows.RoutedEventArgs e){
Items.AddItem(new SingleItem("name_"+count));
count++;
}

}

最后我的XAML看起来像这样(缩写为“......”):

<Window
...
xmlns:local="clr-namespace:DataGridTEst" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:XamlGeneratedNamespace="clr-namespace:XamlGeneratedNamespace" mc:Ignorable="d"
x:Class="DataGridTEst.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">

<Window.Resources>
    <local:ManyItems x:Key="ManyItemsDataSource" d:IsDataSource="True"/>
</Window.Resources>

<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource ManyItemsDataSource}}">
    <Button Content="Button" .... Click="Button_Click"/>
    <DataGrid ... ItemsSource="{Binding AllItems}"/>
</Grid>

当我运行这个应用程序时,网格显示我在构造函数中创建的SingleItem“inside”。但是,对基础集合的更改不会反映在数据网格中。我也试过使用INotifyPropertyChanged但没有成功。我认为我的理解存在严重错误。 谁能解释一下我做错了什么?此外,在线示例(并非所有内容都在构造函数内完成)非常感谢。

感谢您的帮助, 塞巴斯蒂安

2 个答案:

答案 0 :(得分:3)

您在后面的代码中修改的ManyItems实例与您的XAML绑定的实例不同。 <local:ManyItems/> Window Resources中的ManyItems导致创建public MainWindow(){ this.InitializeComponent(); this.DataContext = _items; } 的单独,不同的实例。

使用相同的实例,它可以正常工作:

Resources

在XAML中删除Grid部分,然后将<Grid x:Name="LayoutRoot"> 更改为:

{{1}}

答案 1 :(得分:0)

我找到了另一个解决方案,我可以使用Blend生成的代码。 Everthing保持不变,但MainWindow的工作方式如下:

public partial class MainWindow : Window{
int count=0;
public MainWindow(){
    this.InitializeComponent();
}

private void Button_Click(object sender, System.Windows.RoutedEventArgs e){
          ManyItems ds=(ManyItems)this.FindResource("ManyItemsDataSource");
          ds.AddItem(new SingleItem(count.ToString()));
      count++;
}
}

需要注意的是,不再有属性项目了。代码搜索命名资源“ManyItemsDataSource”并将其强制转换为ManyItems。 @Kent:您对两个不同实例的暗示非常适合让我回到正轨: - )

塞巴斯蒂安