MVVM 可观察集合和绑定
本文关键字:绑定 集合 观察 MVVM | 更新日期: 2023-09-27 18:31:24
我有一个模型:
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();}
}
}
还有视图模型,其中表列表声明:
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}"
确实不受约束。
在名为 TableControl
的用户控件的Xaml
文件中,在根元素中添加DataContext={Binding}
,我认为它应该可以工作(如果它不存在)。
如果您在用户控件(例如TableControl.xaml.cs
)文件的代码隐藏中设置了DataContext
类似this.DataContext = this;
,这使得用户控件不使用Tables
集合的 DataContext,它也可能无法工作。
您可以使用此 SO 答案来检查用户控件TableControl
的数据上下文中的确切内容。
编辑:
也尝试下面,因为根据您的评论,TableControl
的数据上下文是冲突的:
<DataTemplate>
<controls:TableControl DataContext="{Binding}"
TableNumber="{Binding Id}"
North="{Binding North}"
East="{Binding East}"
South="{Binding South}"
West="{Binding West}"
/>
</DataTemplate>