WPF-我应该更喜欢使用依赖属性或方法来更改UserControl内部的状态吗

本文关键字:UserControl 内部 状态 方法 更喜欢 我应该 依赖 属性 WPF- | 更新日期: 2023-09-27 18:28:51

我有一个UserControl,我想根据应用程序逻辑更改其中的UserControl状态。为了明确起见,UserControl有三种状态,即None、Query、Insert(枚举)。

开发人员可以使用我的UserControl设置这些状态。但我无法决定是使用依赖属性的ChangedCallback委托来更改这些状态,还是使用单独的方法更改状态,如SwitchNoneState()、SwitchQueryState()和SwitchInsertState()。

这是第一种方法;

//MyUserControl.cs
public enum States
{
    None,
    Query,
    Insert
}
public States State
{
    get { return (States)GetValue(StateProperty); }
    set { SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty =
    DependencyProperty.Register("State", typeof(States), typeof(MyUserControl), new PropertyMetadata(States.None,StatePropertyChangedCallback));
private static void StatePropertyChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
     var control = (MyUserControl)obj;
     if (args.NewValue == null) return;
     switch ((States)args.NewValue)
     {
         case States.None:
             control.SwitchNoneState();
             break;
         case States.Query:
            control.SwitchQueryState();
             break;
         case States.Insert:
            control.SwitchInsertState();
             break;
     }
}
private SwitchNoneState()
{
    //DoSomethingAboutNoneState
}
private SwitchQueryState()
{
    //DoSomethingAboutQueryState
}
private SwitchInsertState()
{
    //DoSomethingAboutInsertState
}
//XAML using UserControl
<local:MyUserControl Name="uc" State="Query"/>

第二种方法;

//MyUserControl.cs
public enum States
{
    None,
    Query,
    Insert
}
public States State
{
    get { return (States)GetValue(StateProperty); }
}
//User can only access for state information
private static readonly DependencyProperty StatePropertyKey =
    DependencyProperty.RegisterReadOnly("State", typeof(States), typeof(MyUserControl), new PropertyMetadata(States.None));
public static readonly DependencyProperty StateProperty = StatePropertyKey.DependencyProperty;
public SwitchNoneState()
{
    //DoSomethingAboutNoneState
    SetValue(StateProperty,States.None);
}
public SwitchQueryState()
{
    //DoSomethingAboutQueryState
    SetValue(StateProperty,States.Query);
}
public SwitchInsertState()
{
    //DoSomethingAboutInsertState
    SetValue(StateProperty,States.Insert);
}   

//XAML using UserControl
<local:MyUserControl Name="uc"/>
//XAML Code Behind
public void DoSomething()
{
    uc.SwitchQueryState();
}

最佳实践是什么?谢谢

WPF-我应该更喜欢使用依赖属性或方法来更改UserControl内部的状态吗

如果您想支持数据绑定,请使用依赖属性。

难道不能在状态上使用带有触发器的样式或状态的一些模板吗?

它应该可以在XAML中设置,因为在XAML中就是这样做的。这并不像听起来那么愚蠢——或者我应该说,这只是愚蠢到可以纠正的程度。这是保持简单,愚蠢的一个特定情况。

每个XAML控件都允许您在XAML中设置其属性、使用绑定等,每个使用XAML的程序员都能很快学会这一点。你没有提到你的案例有任何独特的、令人信服的理由来打破这种假设,所以不要打破它。这是用户需要设置的只读属性。BZZT!这不是只读属性,而是常规属性。如果在初始化后无法更改,则在不应该尝试的时候抛出异常。

一般来说,当在别人的框架中编写代码时,要把它当作框架的一部分来编写。如果是WPF,那么编写一个WPF控件,消费者很容易将其误认为是System.Windows.Controls命名空间的一部分。如果是Windows窗体,请编写一个同样平淡、可预测的Windows窗体控件。

这有两个原因,它们是相互关联的:

  1. 代码的使用者应该知道预期结果。惊喜浪费时间,制造错误,而且没有任何价值。永远不要让最终用户在没有充分理由的情况下思考。这种逻辑适用于设计编程接口和用户接口。理想是即时和完全的认识和理解。您可以通过尽可能频繁地使用户先前的假设有效,并在所有属性和方法上添加信息丰富的三斜杠Intellisense注释来实现理想
  2. 你不仅应该让用户不需要思考,而且还可以节省大量的思考。广泛使用的框架往往是由聪明的人精心设计的,他们对该领域有着深刻的理解,并在几年内完善了他们的解决方案。像这样的人养了很多狗,但习惯的狗通常都是好的(如果是坏的,以预期的方式表现得糟糕,可以最大限度地减少痛苦)。你出色的、创造性的新界面编写方式充其量是他们认为不切实际的有缺陷的想法之一,因为如果你想变得聪明,你很快就会学到困难的方法

记住,六个月后,你不用思考的用户可能就是。在编程中,思维是出现严重错误的危险区域之一。

唯一的例外是,如果你不是在扩展一个框架,而是用一个新的框架来替换它:例如,jQuery打破了眼前的每一个假设,但它用新的假设来替换它们,这些假设(在大多数情况下)都是一致应用的,并且有很大的价值。既然jQuery已经存在,如果您正在编写使用jQuery的代码,请使用jQuery方式进行编写。

但也要注意,学会不做傻事的最好方法是努力行善,并因此而受苦。一个人必须受苦才能掌握。一个年轻的程序员应该尽早并且经常地受苦。