【问题标题】:mvvm observablecollection and bindingmvvm observablecollection 和绑定
【发布时间】: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 接下来,重新运行并检查输出窗口,看看有什么错误。

标签: c# wpf xaml mvvm


【解决方案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。检查它是否有效,否则您需要找到其他替代方法。
猜你喜欢
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
相关资源
最近更新 更多