【发布时间】:2015-06-23 13:43:27
【问题描述】:
我有两个定义如下的用户控件:
用户控制 1
XAML
<UserControl x:Class="TestBindings.UserControlOne"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestBindings">
<UserControl.DataContext>
<local:UserControlOneViewModel/>
</UserControl.DataContext>
<StackPanel>
<TextBlock Text="{Binding MyProperty}"/>
<local:UserControlTwo PropertyTwo="{Binding DataContext.MyProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
</StackPanel>
</UserControl>
代码背后
public partial class UserControlOne : UserControl
{
public UserControlOne()
{
InitializeComponent();
}
}
用户控制 2
XAML
<UserControl x:Class="TestBindings.UserControlTwo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestBindings">
<UserControl.DataContext>
<local:UserControlTwoViewModel/>
</UserControl.DataContext>
<TextBlock Name="TextBlock" Text="{Binding PropertyTwo}"/>
</UserControl>
代码背后
public partial class UserControlTwo : UserControl
{
public static readonly DependencyProperty PropertyTwoProperty =
DependencyProperty.Register("PropertyTwo", typeof (string), typeof (UserControlTwo),
new FrameworkPropertyMetadata("Default", OnPropertyTwoChanged));
public UserControlTwo()
{
InitializeComponent();
var propertyTwoBinding = new Binding("PropertyTwo") {Mode = BindingMode.TwoWay};
SetBinding(PropertyTwoProperty, propertyTwoBinding);
}
public string PropertyTwo
{
get { return (string) GetValue(PropertyTwoProperty); }
set { SetValue(PropertyTwoProperty, value); }
}
private static void OnPropertyTwoChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var userControlTwo = (UserControlTwo) d;
userControlTwo.PropertyTwo = (string) e.NewValue;
}
}
在 UserControlTwo 的构造函数中,我将依赖属性 PropertyTwoProperty 绑定到关联 ViewModel 中的属性。我最终想将它绑定到 UserControlOne 的 ViewModel 中的一个属性,因此 UserControlOne xaml
<local:UserControlTwo PropertyTwo="{Binding DataContext.MyProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
但是,这似乎永远不会成立。有什么想法我可能会出错吗?
【问题讨论】:
-
我不明白。如果要在UserControlOne中将
UserControlTwo.PropertyTwo绑定到DataContext的MyProperty,只需<local:UserControlTwo PropertyTwo="{Binding MyProperty}"/>即可。 UserControlTwo的构造函数中无需调用SetBinding。 -
我认为您甚至不需要相对源,只需 PropertyTwo="{Binding MyProperty} 就可以了。您已经获得了数据上下文,无需指定它
-
此外,OnPropertyTwoChanged 回调没有意义。它将
PropertyTwo(再次)设置为它刚刚获得的值(这就是调用 PropertyChanged 的原因)。 -
@Clemens 我想在 UserControlTwo 的 ViewModel 中为 UserControlTwo 做一些视图逻辑,因此如何在 xaml 中设置绑定但在 UserControlTwo 的 ViewModel 中获取该属性
-
简单地说,如何将自定义控件的依赖属性“连接”到其 ViewModel 中的属性
标签: wpf binding dependency-properties