【问题标题】:Is it unconventional to use a Property this way? [closed]以这种方式使用属性是否非常规? [关闭]
【发布时间】:2018-09-09 19:13:29
【问题描述】:

我正在为 WPF 应用程序创建自定义按钮控件。 Button 包含一个 ViewBox,而后者又包含一个像这样的 TextBlock

<Button>        
    <Viewbox>
        <TextBlock Name="TextHolder"/>
    </Viewbox>
</Button>

我希望 C# 中的外部类能够直接通过属性访问和更改文本,就像这样;

public string Text
{
    get { return TextHolder.Text; }
    set
    {
        TextHolder.Text = value;
    }
}

我想知道这是否被认为是不好的做法?

谢谢。

【问题讨论】:

  • 您最好将这个问题发布到codereview.stackexchange.com 以获得一些好的反馈。
  • 如果Text 是自定义 WPF 控件中的属性,最好将其设为 DependencyProperty。 (stackoverflow.com/a/18592862/2819245)
  • 为什么将其限制为文本,而不是像 WPF 的默认按钮类那样允许完整的ContentControl

标签: c#


【解决方案1】:

你的这段代码让负责“业务逻辑”的部分代码看起来像:

this.Text = "mom";

而不是例如:

this.TextHolder.Text = "mom";

区别在于访问/公开 TextHolder UI 组件。你不想暴露他们。那应该只是“演示风格”的一个细节。理想情况下,代码不应该关心视觉效果如何(好吧,除非您实际上正在为“TextBlock”之类的视觉组件编写代码)。如果您更改 UI 并且 TextHolder 不再存在并且现在您有不同的文本呈现方式,例如它没有 control.Text 而是 control.Data 或 control.Content,该怎么办?如果 TextHolder 被暴露,您必须在各处更正代码。使用您的代码,“无处不在”使用您的属性 this.Text,并且 TextHolder 是隐藏的,因此当它消失时,您只需更改 Text 属性 getter/setter。这是一件很棒的事情。

这就是为什么,如果有人告诉你任何关于这件事的负面消息,那就错了。一切都比在整个业务逻辑代码中分散对 UI 组件的访问要好。如果您想解决这个问题并想出这样的解决方案 - 太好了!

话虽如此,这并不是你能拥有的最好的,这就是赞美的结束。

首先你说你正在使用WPF。在 WPF 中有一种称为数据绑定的机制。如果您从未使用过它,我只想说它......强大。有时笨拙,但功能强大。如果您学会并使用了数据绑定,您仍然会有 Text 属性,但您的代码根本不会有 TextHolder,甚至在 .Text 的 getter/setter 中也没有

更进一步,一旦您至少了解了数据绑定的基础知识,您就可以更进一步了解 MVVM 模式。这个具有消灭.xaml.cs 并将所有内容移动到与视图无关的“视图模型”的力量 - 具有属性且从不直接接触 UI 的普通 C# 类。 WPF 有机制来观察它们的属性是否发生任何变化,然后自动刷新 UI。它有两种工作方式 - 单击/写入控件可能会刷新“视图模型”中的属性。

但这是有代价的。这一切都很好而且很花哨,但是需要您编写一些重复的样板代码并保留一些定义的模式(尽管像 PostSharp 这样的工具可以为您做到这一点,或者像 Caliburn.Micro 这样的框架可以大大简化 XAML 中的数据绑定表达式.. )。

【讨论】:

  • 非常感谢您的帮助! MVVM 是我认为的前进方向,这就是我在没有正式化的情况下已经编程的方式。我已经有几年没有编程了,并且正在寻求重新加入,所以我将遵循其中的一些学习路线!再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2013-10-08
  • 2018-11-28
相关资源
最近更新 更多