捆绑。处理元素之间的差异

时间:2013-03-24 07:29:03

标签: c# windows-phone-8 windows-phone

这里有一些聪明人告诉我在操作UI项目时我应该使用绑定的东西。好吧,我对绑定主题有所了解,但是有一件令人讨厌的事情让我大吃一惊。让我们举一个例子,这样我就能更好地描述我的问题。

xaml代码:

<TextBox x:Name="MyTextBox" 
                 Text="Text" 
                 Foreground="{Binding Brush1, Mode=OneWay}"/>

c#c​​ode:

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的例子没有给我一个明确的答案。

2 个答案:

答案 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上工作。他们几乎只需要交换用户界面需要了解的内容而不是其他内容。