我一直在努力解决这个问题并阅读了很多,但大多数例子都太简单了。我试图将一个非常简单的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但没有成功。我认为我的理解存在严重错误。 谁能解释一下我做错了什么?此外,在线示例(并非所有内容都在构造函数内完成)非常感谢。
感谢您的帮助, 塞巴斯蒂安
答案 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:您对两个不同实例的暗示非常适合让我回到正轨: - )
塞巴斯蒂安