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的双向绑定和过滤

ObservableCollection刷新视图MVVM

Datagrid 不显示来自 ObservableCollection 的 MVVM 中的数据

ObservableCollection CollectionChanged 在 WPF MVVM 中没有帮助

在MVVM中将SearchBar与ObservableCollection一起使用

检查绑定到 MVVM 应用程序中 ObservableCollection 的 ListBox 中的选定项目