我有一个UserControl,它用作ItemsControl中项目的基础:
主页xaml:
<ItemsControl ItemsSource="{Binding Systems, Mode=TwoWay}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:ServerGroupControl>
<local:ServerGroupControl.DataContext>
<local:ServerGroupControlViewModel System="{Binding}"/>
</local:ServerGroupControl.DataContext>
</local:ServerGroupControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我正在尝试设置每个ViewModel的'System'属性(以便它可以处理 View 的数据),但是从未设置该属性!
这是 View 模型类中的依赖属性声明:
public static readonly DependencyProperty SystemProperty = DependencyProperty.Register(
"System",
typeof(ServerGroup),
typeof(ServerGroupControlViewModel)
);
public ServerGroup System
{
get { return (ServerGroup)GetValue(SystemProperty); }
set { SetValue(SystemProperty, value); }
}
该属性始终保留其默认值。关于为何此设置无效的任何想法?
最佳答案
因此,根据您的评论,我会怀疑绑定(bind)不起作用,因为您尝试绑定(bind)的地方没有DataContext
。
您的VM不是FrameworkElement
,因此它没有DataContext
属性,大概也不是Freezable
(因此也可能没有继承上下文),因此我怀疑这是行不通的。 (顺便说一句,ElementName
和RelativeSource
也不起作用)
我建议您采用不同的方法,由于线程相似性和其他问题,我也不建议在VM中使用DP。
这是一种变通方法:
<DataTemplate>
<local:ServerGroupControl Name="sgc">
<local:ServerGroupControl.Resources>
<local:ServerGroupControlViewModel x:Key="context"
System="{Binding Parent.DataContext, Source={x:Reference sgc}}" />
</local:ServerGroupControl.Resources>
<local:ServerGroupControl.DataContext>
<StaticResource ResourceKey="context" />
</local:ServerGroupControl.DataContext>
</local:ServerGroupControl>
</DataTemplate>
是的,请不要那样做...
关于c# - 绑定(bind)未更新UserControl的ViewModel的DependencyProperty,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9059001/