我已经从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));
答案 0 :(得分:-2)
这是毫无意义的(你的设计需要重新考虑),如果你破解它,你的绑定只会在加载时起作用。
DependencyProperty getters / setters访问GetValue中定义的SetValue和DependencyObject方法。
这些方法是实例方法。因此,您必须在某种类型的实例上调用它们。
还有一个限制,虽然您可以绑定到静态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;博士:你的团队负责人不知道他在说什么。