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}"

确实不受约束。

MVVM 可观察集合和绑定

在名为 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>