MVVM依赖属性和DataContext

时间:2014-01-09 20:45:45

标签: c# wpf mvvm dependency-properties

我在解决可能非常愚蠢的事情时遇到了问题。

我在用户控件的父控件上有这个xaml:

<Map:LocationInformationControl FarmerID="{Binding SelectedFarmerID}"></Map:LocationInformationControl>

在这个xaml打开的控件中,它的viewmodel上有SelectedFarmerID属性,并且一切都很好。

我的LocationInformationControl是一个自定义控件,我有这个依赖属性:

       public static readonly DependencyProperty FarmerIDProperty = DependencyProperty.Register(
        "FarmerID", 
        typeof(int),
        typeof(LocationInformationControl), 
        new FrameworkPropertyMetadata(
            0, new PropertyChangedCallback(OnFarmerIDChanged)
            ));

    public int FarmerID
    {
        get 
        { 
            return (int)GetValue(FarmerIDProperty); 
        }
        set 
        { 
            SetValue(FarmerIDProperty, value); 
        }
    }

这是我的On Property Changed Callback

    private static void OnFarmerIDChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

    }
它发射很好,一切都很棒。但是,当我将视图模型连接到自定义控件时,如下所示:

this.DataContext = new LocationInformationViewModel()

属性已更改回调将不再触发。我假设它是因为我正在更改控件的数据上下文,因此它将不再找到FarmerID。但无论如何我可以像这样设置一个ViewModel并且在同一个控件上仍然有一个依赖属性吗?

谢谢, 亚伦

1 个答案:

答案 0 :(得分:2)

DataContext UserControl设置为自身,或者根据您的情况设置视图模型,来自该控件是一个常见错误。有许多初学者教程展示了这一点,但这仅仅是因为它是在WPF中将数据导入UI的最快捷,最简单的方法之一。 [当然,例外。]

因此,不要将DataContext内部设置为视图模型而将Binding设置为控件内的UserControl属性,而不是......:

<TextBlock Text="{Binding FarmerID}" />

...不要设置DataContext并使用以下RelativeSource Binding

<TextBlock Text="{Binding FarmerID, RelativeSource={RelativeSource AncestorType={x:Type
YourLocalXmlNamespacePrefix:LocationInformationControl}}}" />

通过这种方式,无论Binding是否设置,FarmerID都会在LocationInformationControl控件中查找DataContext。您可以几乎将此视为设置DataContext,但仅限于此Binding