需要依赖属性在基类中是静态的

时间:2013-02-12 15:47:34

标签: c# wpf mvvm dependency-properties .net-4.5

我已经从WPF应用程序中的CLR属性转移到依赖项属性。我有一个问题,以下代码在基类中,我需要从各种其他视图模型访问。当它是CLR属性时它是静态的但现在不是,所以总是在未设置它的视图模型中返回null。有没有办法解决这个问题?

    public Tuple<Guid, string> SelectedEntity
    {
        get { return (Tuple<Guid, string>)GetValue(SelectedEntityProperty); }
        set { SetValue(SelectedEntityProperty, value); }
    }

    public static readonly DependencyProperty SelectedEntityProperty =
        DependencyProperty.Register("SelectedEntity", typeof(Tuple<Guid, string>), typeof(MyViewModelBase), new PropertyMetadata(null));

1 个答案:

答案 0 :(得分:-2)

这是毫无意义的(你的设计需要重新考虑),如果你破解它,你的绑定只会在加载时起作用。

DependencyProperty getters / setters访问GetValue中定义的SetValueDependencyObject方法。

这些方法是实例方法。因此,您必须在某种类型的实例上调用它们

还有一个限制,虽然您可以绑定到静态DP,但您只能从XAML中读取它们,并且您在绑定中丢失了所有更改通知。这是一个说明这一点的最小复制品。

以下是窗口的类和带有静态DP的类型。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new StaticDpsAreGoofy();
    }
    private void ERMAGERD(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(StaticDpsAreGoofy.Lol, "ERMAGERD");
        StaticDpsAreGoofy.Lol = "ERMAGERD";
    }
}

public sealed class StaticDpsAreGoofy : DependencyObject
{
    public static readonly DependencyProperty LolProperty =
        DependencyProperty.Register(
            "Lol",
            typeof(string),
            typeof(StaticDpsAreGoofy),
            new UIPropertyMetadata("You have GOT to be kidding me"));

    public static string Lol
    {
        get { return (string)_omgHack.GetValue(LolProperty); }
        set { _omgHack.SetValue(LolProperty, value); }
    }

    private static readonly DependencyObject _omgHack = new DependencyObject();
}

注意,我将Lol属性标记为static,这意味着我必须使用DependencyObject的实例来“保持”属性的值({{ 1}})。

以下xaml是其使用的一个示例,

_omgHack

注意静态绑定上的<Window x:Class="StaticDP.MainWindow" xmlns:t="clr-namespace:StaticDP" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <StackPanel> <Label>From instance</Label> <TextBox Text="{Binding Lol}" /> <Label>From type</Label> <TextBox Text="{Binding Mode=OneWay, Source={x:Static t:StaticDpsAreGoofy.Lol}}" /> <Button Click="ERMAGERD">ERMAGERD</Button> </StackPanel> </Window> 。如果删除它,并尝试对静态属性进行双向绑定,此绑定将在加载时失败

如果您构建并运行它,您将看到两个文本框都包含加载时的预期文本。但是,如果更改第一个TextBox中的文本,然后单击该按钮,您将看到通过代码隐藏访问的值或UI中的绑定都不会更新。

在代码隐藏中更改值时,UI中的值不会更新。

tl;博士:你的团队负责人不知道他在说什么。