我在 View 中添加了DependencyProperty,绑定(bind)到DependencyProperty可以正常工作,但前提是我没有同时设置DataContext。
GenericView.xaml
<UserControl x:Class="GenericProject.View.GenericView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Button Command="{Binding VMFactory.CreateViewModelCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
<TextBox IsEnabled="False" Text="{Binding SomeProperty, Mode=OneWay}" />
</StackPanel>
</UserControl>
GenericView.xaml.cs
public partial class GenericView : UserControl
{
// The DependencyProperty for VMFactory.
public static readonly DependencyProperty VMFactoryProperty = DependencyProperty.Register("VMFactory", typeof(VMFactoryViewModel<GenericViewModel>), typeof(GenericView));
public VMFactoryViewModel<GenericViewModel> VMFactory
{
get { return (VMFactoryViewModel<GenericViewModel>)GetValue(VMFactoryProperty); }
set { SetValue(VMFactoryProperty, value); }
}
public GenericView()
{
InitializeComponent();
}
}
在这里,我创建两个 View 来说明当前的问题。因为我设置了DataContext,所以第一个 View 中的VMFactory绑定(bind)将失败。第二种观点将会成功,这种现象的原因是什么?
MainPage.xaml
<vw:GenericView DataContext="{Binding Generic}" VMFactory="{Binding GenericFactory}" />
<vw:GenericView VMFactory="{Binding GenericFactory}" />
最佳答案
这是一个相当普通的绑定(bind)“陷阱” ...
为了访问VMFactory
,您需要使用...将UserControl
绑定(bind)到自身。
DataContext="{Binding RelativeSource={RelativeSource Self}}"
然后,您就不会将
DataContext
项上的GenericView
绑定(bind)到其他任何地方。但是,如果您打算将其他值绑定(bind)到
VMFactory
外部的UserControl
(即<vw:GenericView VMFactory={Binding ...}"/>
),则应将RelativeSource
与FindAncestor
模式一起使用,类型为UserControl
。<!-- Shortened to show pertinent Binding -->
<ctrl:CommandTextBox Command="{Binding VMFactory.CreateViewModelCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}"/>
关于c# - 当UserControl具有DataContext时,UserControl的DependencyProperty为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27526778/