我在 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 ...}"/>),则应将RelativeSourceFindAncestor模式一起使用,类型为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/

10-13 08:54