gpt4 book ai didi

c# - 传播 DependencyProperty 默认值

转载 作者:太空宇宙 更新时间:2023-11-03 21:11:31 28 4
gpt4 key购买 nike

我有一个带有 ViewModel 的 WPF UserControl:

<MyUserControl ...>
<Grid Name="UxRootContainer">
<Grid.DataContext>
<MyViewModel/>
</Grid.DataContext>
</Grid>
</MyUserControl>

这个 UserControl 有一个 DependencyProperty,必须传播到 ViewModel:

public static readonly DependencyProperty DurationProperty = 
DependencyProperty.Register( "Duration", typeof(TimeSpan),
typeof(MyUserControl), new FrameworkPropertyMetadata(TimeSpan.FromHour(1), OnDurationChanged ));

public TimeSpan Duration
{
get { return (TimeSpan)GetValue(DurationProperty); }
set { SetValue(DurationProperty, value); }
}

private static void OnDurationChanged(DependencyObject source,
DependencyPropertyChangedEventArgs e)
{
MyUserControl control = source as MyUserControl;
TimeSpan duration = (TimeSpan)e.NewValue;
control.UxRootContainer.SetDuration(duration);
}

这工作正常,除了我们不会在 OnDurationChanged 事件中收到默认值。

我知道我可以在构造函数中自己调用此方法,将默认持续时间放入常量,但是:

  • 我必须为每个 DependencyProperty 创建一个常量
  • 即使最后我不使用默认值,我也必须调用它

任何关于如何将默认值传播到 ViewModel 的好建议,前提是默认值是最后使用的值(不是其他值集)。

最佳答案

我决定写一个答案(以防万一我错了:)。

在给定的情况下,您正在创建自定义控件,这意味着在其他 View 中是一个简单的控件。两点:

  • 不创建 ViewModel;
  • 不要设置此控件的DataContext

在这种情况下,ViewModel 没有任何作用:没有可从中抽象出的基础模型,没有任何东西(不是 View,也不是 ViewModel)将被重用。没有 ViewModel 存在默认值已经是依赖属性的默认值 = 问题已解决。

至于 DataContext:如果您尝试在列表中使用此控件将项目属性绑定(bind)到它,您将始终必须通过父容器 DataContext 引用它(因为控件有其重写和绑定(bind) "{Binding Text}" 不会引用该项目 Text 属性,而是引用控件 ViewModel Text 属性,您将不得不做一些事情像 "{Binding DataContext.Text, RelativeSource={RelativeSource FindAncestor, AncestorType=Grid}}")。这在任何设计中都是不对的。

关于c# - 传播 DependencyProperty 默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37318809/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com