以这种方式使用房产是不合常的吗?

时间:2018-03-30 18:35:15

标签: c#

我正在为WPF应用程序创建自定义按钮控件。 按钮包含 ViewBox ,其中包含 TextBlock ,就像这样;

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:0)

您的这段代码允许代码的一部分负责&#34;业务逻辑&#34;看起来像:

this.Text = "mom";

而不是例如:

this.TextHolder.Text = "mom";

区别在于访问/公开TextHolder UI组件。你不想暴露它们。这应该只是演示风格的细节&#39;。理想情况下,代码不应该关注视觉效果的外观(好吧,除非你实际上是为可视组件编写代码,例如TextBlock&#39;)。如果您更改UI并且TextHolder不再存在,现在您有不同的文本表示,例如它没有control.Text而是control.Data或control.Content?如果暴露了TextHolder,您必须在任何地方更正代码。用你的代码片,那个&#34;无处不在&#34;使用你的属性this.Text,TextHolder是隐藏的,所以当它消失时,你只需更改Text属性getter / setter。这是一件好事。

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

话虽如此,但这并不是你能做到的最好的,而且这也是赞美结束的地方。

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

中也没有

更进一步,一旦你至少学习了数据绑定的基础知识,你可以进一步研究MVVM模式。这个具有消灭.xaml.cs的能力,并将所有东西都移动到视图不可知的视图模型和#34; - 具有属性并且从不直接触摸UI的普通C#类。 WPF具有监视它们的属性中的任何更改然后自动刷新UI的机制。它有两种工作方式 - 单击/写入控件可以刷新&#34;视图模型中的属性&#34;。

但这是一个成本。这一切都很好,但要求你写一些重复的锅炉代码并保留一些定义的模式(尽管像PostSharp这样的工具可以为你做,或像Caliburn.Micro这样的框架可以大大简化数据绑定表达式在XAML ..)。

相关问题