我正在为WPF应用程序创建自定义按钮控件。 按钮包含 ViewBox ,其中包含 TextBlock ,就像这样;
<Button>
<Viewbox>
<TextBlock Name="TextHolder"/>
</Viewbox>
</Button>
我希望C#中的外部类能够通过属性直接访问和更改文本,就像这样;
public string Text
{
get { return TextHolder.Text; }
set
{
TextHolder.Text = value;
}
}
我想知道这是否被认为是不好的做法?
感谢。
答案 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 ..)。