【发布时间】:2017-07-06 09:33:04
【问题描述】:
编辑:将视图模型设置为DataContext
这里有很多关于 SO 的问题,但它们都围绕着做一些时髦的 CodeBehind 东西。我想要的是:
我有一个这样的视图模型:
public class FooViewModel : INotifyPropertyChanged {
public Foo Foo {
get { ...}
set { ... }
}
}
我在我的 UserControl 中这样定义:
<UserControl.DataContext>
<vm:FooViewModel />
</UserControl.DataContext>
在我的 CodeBehind 文件中,我定义了一个 DependencyProperty:
public Foo Foo {
get { return (Foo)GetValue(FooProperty); }
set { SetValue(FooProperty, value); }
}
// Using a DependencyProperty as the backing store for Foo. This enables animation, styling, binding, etc...
public static readonly DependencyProperty FooProperty =
DependencyProperty.Register("Foo", typeof(Foo), typeof(FooControl), new PropertyMetadata(null));
所以我现在可以在其他地方使用控件时绑定Foo 属性。
缺少的链接是:如何将 UserControl 的 Foo 绑定到 ViewModel 的 Foo?
目前,我在 CodeBehind 中使用了一些复杂的事件处理来同步这些,但我认为 XAML 中必须有一种方法可以做到这一点,还是没有?
【问题讨论】:
-
所以你的视图模型不是你控制的
DataContext? -
如果我将其设为
DataContext,我该如何将其绑定到依赖属性? -
用户控件不应该有自己的视图模型。相反,它应该在其父控件或窗口的继承 DataContext 中对视图模型进行操作。
-
那么我应该如何做一个独立的用户控件呢?我真的应该用
DependencyProperties定义代码隐藏中的所有内容并在那里执行逻辑吗? -
您没有告诉过您想对 Foo 依赖项属性做什么,但通常您会将 UserControl 的 XAML 中的控件属性绑定到该属性。您可以通过使用 RelativeSource 绑定来做到这一点,例如
<Label Content="{Binding Foo, RelativeSource={RelativeSource AncestorType=UserControl}}" />
标签: c# wpf xaml user-controls