这里有一些聪明人告诉我在操作UI项目时我应该使用绑定的东西。好吧,我对绑定主题有所了解,但是有一件令人讨厌的事情让我大吃一惊。让我们举一个例子,这样我就能更好地描述我的问题。
xaml代码:
<TextBox x:Name="MyTextBox"
Text="Text"
Foreground="{Binding Brush1, Mode=OneWay}"/>
c#code:
public class MyColors : INotifyPropertyChanged
{
private SolidColorBrush _Brush1;
// Declare the PropertyChanged event.
public event PropertyChangedEventHandler PropertyChanged;
// Create the property that will be the source of the binding.
public SolidColorBrush Brush1
{
get { return _Brush1; }
set
{
_Brush1 = value;
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("Brush1");
}
}
// NotifyPropertyChanged will raise the PropertyChanged event,
// passing the source property that is being updated.
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
现在要更改前景的颜色,我可以在代码中写一下:
MyColors textcolor = new MyColors();
// Brush1 is set to be a SolidColorBrush with the value Red.
textcolor.Brush1 = new SolidColorBrush(Colors.Red);
// Set the DataContext of the TextBox MyTextBox.
// MyTextBox.DataContext = textcolor;
MyTextBox.Foreground = new SolidColorBrush(Colors.Blue);
Phew终于得到了它。
现在让我们转到我使用的第二个解决方案。
XAML:
<TextBox x:Name="MyTextBox"/>
C#: MyTextBox.Foreground = new SolidColorBrush(Colors.Red);
是的,同样的效果:o 所以现在我的问题就是。什么出价给了我超越这个东西?在这一点上,我没有看到结果有太大差异,期望第一个例子占用更多空间并且实现均匀,第二个占用2行。 任何人都可以给他们一个很好的例子,他们很方便,bcs msdn的例子没有给我一个明确的答案。
答案 0 :(得分:2)
第一种方式(使用MVVM设计模式)将视图模型与视图分离,从而允许可测试性并可以在更短的时间内迁移到其他平台。
第二种方式很简单,但它紧密耦合。阅读MVVM设计模式,全面了解其优势。
答案 1 :(得分:0)
首先要做的事情......在你的问题中,你注释掉了设置MyTextBox.DataContext的行,所以你甚至都没有使用绑定。然后在下一行中,将值直接设置为蓝色,这意味着您刚输入的所有其他内容甚至都没有被使用。我不确定你为什么这样做,但除此之外还有一点点。可能只是一个错字,但我不会编辑它,因为我不确定你的意图。
了解问题的“关键”,如前所述,您执行操作的第一种方式是遵循MVVM或Model-View-ViewModel模式。模型是数据,或者是这种情况下的画笔。 View是TextBox,ViewModel就是你所说的MyColors。 ViewModel实现IPropertyChanged,因此它可以为侦听器(例如绑定)引发更改通知以进行侦听。
使用MVVM而不是在第二种情况下设置它的方式(在代码隐藏中直接设置值)的原因与分离代码的关注点有关。具体而言,应用程序及其业务规则的逻辑与UI的逻辑分开。
例如,您的业务逻辑可能会说“错误文本需要为红色”,因此您可以在ViewModel上公开名为ErrorTextBrush的属性。您不需要考虑TextBox的名称,或者即使它出现在屏幕上也是如此。您已将业务问题与UI问题分开。
同样,开发UI的人不需要考虑与业务逻辑相关的任何事情。他们需要知道的是,他们将屏幕上的TextBox定义为错误文本的占位符,因此他们只需将ErrorTextBox.Foreground绑定到ErrorTextBrush,现在UI遵循业务逻辑所指示的内容。
实际上,人们可以(而且应该)更进一步,并在XAML中定义ErrorTextBrush,因为它与视图有关,而与业务逻辑无关。然后在ViewModel中,你有一个像HasError这样的属性,你在XAML中设置了一个触发器或绑定,如果出现错误则表示使用该错误刷,否则使用标准画笔。
在这种情况下,业务逻辑甚至不必知道文本是红色的。这完全取决于用户界面。相反,UI根本不需要知道导致错误的原因。它只需要知道 是一个错误,所以它需要向用户显示反映它的视觉效果。
同样如上所述,ViewModel只是一个普通的类,而不是一个可以更容易进行单元测试的UI。例如,使用上面的示例来测试,您需要做的就是实例化ViewModel,设置触发错误的条件,然后测试以查看HasError属性是否被触发。你可以在没有任何用户界面的情况下完成所有这些工作。
这允许开发人员处理应用程序的逻辑,设计人员只需很少的交互即可在UI上工作。他们几乎只需要交换用户界面需要了解的内容而不是其他内容。