8

假设我的屏幕上有一个部分正在编辑“当前记录”。所以我的视图模型有一个包含所有当前编辑属性的类,例如:

class Record { 
    public string Notes { get { return "Foo"; } set { _notes = value; Notify("Notes"); }
}

我们将这个类添加到视图模型中:

class AdjustsmentViewModel {
    public Record CurrentRecord { get { return new Record(); }}
}

如何在我的视图中绑定到 CurrentRecord 的 Notes 属性?我试过这个:

<TextBox Text="{Binding CurrentRecord.Notes, Mode=TwoWay}" VerticalScrollBarVisibility="Auto" TextWrapping="WrapWithOverflow" AcceptsReturn="True"  />

但是,这不起作用。我还尝试设置周围 StackPanel 的 DataContext:

<StackPanel DataContext="{Binding CurrentRecord}">

之后,我在我的 TextBox {Binding Notes} 和 {Binding Path=Notes} 中进行了尝试,但这些似乎都不起作用。

也许上面真的应该工作,我在别处搞砸了?

更新

这发生在用户控件中。这个用户控件有一个独立的视图模型,来自它的父窗口。

this.DataContext = UnityUtil.Resolve<AdjustmentsViewModel>();

我还看到一个绑定错误:在'object'''MainViewModel'上找不到'Notes'属性

该视图模型设置在主窗口上。

为了验证我是否绑定了正确的 ViewModel,我只是直接在 viewmodel 上添加了这个属性:

public string Notes2 { get { return "Bar"; } } 

和视图中的相应文本块:

<TextBlock Text="{Binding Path=Notes2}" />

这按预期工作。

巨大的成功

感谢瑞安,我能够找到问题所在。它不在属性本身,而是在设置 CurrentRecord 的方式。在我的设置器中,我调用了 INotifyPropertyChange 处理程序,但其中包含属性的旧名称。所以视图没有收到 CurrentRecord 通知,所以我猜 Notes 通知是不够的..

总之,这个符号是正确的:{Binding Path=CurrentRecord.Notes}

4

2 回答 2

8

以上应该有效,{Binding Path=CurrentRecord.Notes} 是正确的。您可以检查您的数据上下文是否设置为您的视图模型?

还要检查您的视图模型是否实现了 INotifyPropertyChanged。

编辑:我刚刚创建了一个示例项目来重新创建它。无需实现 INotifyPropertyChanged,它只在数据上下文设置为 VM 时工作。

于 2012-07-23T20:11:35.583 回答
1

确保您的 CurrentRecord 属性是 1) 正在设置和 2) 通知 UI 层发生了更改。

于 2012-07-23T23:01:04.980 回答