我有一个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(因此也可能没有继承上下文),因此我怀疑这是行不通的。 (顺便说一句,ElementNameRelativeSource也不起作用)

我建议您采用不同的方法,由于线程相似性和其他问题,我也不建议在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/

10-12 07:40