我在解决可能非常愚蠢的事情时遇到了问题。
我在用户控件的父控件上有这个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并且在同一个控件上仍然有一个依赖属性吗?
谢谢, 亚伦
答案 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
。