mvvm observablecollection 和绑定
Posted
技术标签:
【中文标题】mvvm observablecollection 和绑定【英文标题】:mvvm observablecollection and binding 【发布时间】:2013-09-18 14:02:57 【问题描述】:我有一个模型:
public class Table : ViewModelBase
private int _id;
private string _north;
private string _east;
private string _south;
private string _west;
public int Id
get
return _id;
set
_id = value; OnPropertyChanged();
public string North
get return _north;
set _north = value; OnPropertyChanged();
public string East
get return _east;
set _east = value; OnPropertyChanged();
public string South
get return _south;
set _south = value; OnPropertyChanged();
public string West
get return _west;
set _west = value; OnPropertyChanged();
还有声明表列表的 ViewModel:
Tables = new ObservableCollection<Table>();
在 XAML 中:
<ScrollViewer.Resources>
<ItemsPanelTemplate x:Name="MyWrapPanel">
<toolkit:WrapPanel MinWidth="250" Width="Binding ViewportWidth, ElementName=MyScrollViewer" />
</ItemsPanelTemplate>
</ScrollViewer.Resources>
<ItemsControl ItemsSource="Binding Tables" ItemsPanel="StaticResource MyWrapPanel" Grid.RowSpan="2" Grid.Row="1">
<ItemsControl.ItemTemplate>
<DataTemplate>
<controls:TableControl
TableNumber="Binding Id"
North="Binding North"
East="Binding East"
South="Binding South"
West="Binding West"
/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
但是当我将元素添加到表格列表时,一切正常。 但是
TableNumber="Binding Id"
North="Binding North"
East="Binding East"
South="Binding South"
West="Binding West"
确实没有绑定。
【问题讨论】:
什么是ViewModelBase
?您需要在OnPropertyChanged();
中指定属性名称。这是通过反射或其他方式在ViewModelBase
中发生的吗?
发布TableControl
的代码和XAML。
@PoweredByOrange 是一个feature in .Net 4.5
@HighCore 他没有提到他正在使用 .NET 4.5。这些小错误对于 WPF 初学者来说很常见。
看起来正确。您的问题可能在其他地方。确保打开数据绑定的调试消息:i.stack.imgur.com/MF8i5.png 接下来,重新运行并检查输出窗口,看看有什么错误。
【参考方案1】:
在名为TableControl
的用户控件的Xaml
文件中,添加DataContext=Binding
在根元素中,我认为它应该可以工作(如果它不存在)。
如果您有DataContext
将用户控件(例如TableControl.xaml.cs
)文件后面的代码设置为this.DataContext = this;
之类的代码inside,它也可能不起作用,这使得用户控件无法使用Tables
集合的 DataContext。
您可以使用this SO Answer 检查用户控件TableControl
的DataContext 中的确切内容。
编辑:
也试试下面,因为根据您的评论,TableControl
的 DataContext 是冲突的:
<DataTemplate>
<controls:TableControl DataContext="Binding"
TableNumber="Binding Id"
North="Binding North"
East="Binding East"
South="Binding South"
West="Binding West"
/>
</DataTemplate>
【讨论】:
代码中有 DataContext = this;和一些 DependenceProperites。真的没有什么有趣的:) @alerya 更新了答案以根据您的评论添加 XAML。检查它是否有效,否则您需要找到其他替代方法。以上是关于mvvm observablecollection 和绑定的主要内容,如果未能解决你的问题,请参考以下文章
WPF/MVVM中ObservableCollection的双向绑定和过滤
Datagrid 不显示来自 ObservableCollection 的 MVVM 中的数据
ObservableCollection CollectionChanged 在 WPF MVVM 中没有帮助