XAML DataBinding Clarity

时间:2017-04-04 21:35:18

标签: c# xaml data-binding uwp

想知道是否有人可以帮我解决这个问题? DataBinding从XAML元素到ViewModel中的值(例如:1),或者从CodeBehind(例如2)返回到元素,如... HostName.Text?

<TextBlock Text="{Binding HostName}" /> --- (ex:1)
<TextBlock Name="HostName" /> --- (ex:2)

POGO

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Task;

namespace AppName.Models
{

public class Contact
{
    [Key]
    public int Id {get; set;}
    public string Team { get; set;}
    public string FirstName { get; set;}
    public string LastName { get; set;}
    public string Phone { get; set;}
    public string Email { get; set;}
    public string Role { get; set;}
    public string DisplayName => $"[LastName}, {FirstName}";
}
}

1 个答案:

答案 0 :(得分:1)

简单的答案是,这取决于您的应用和需求。当您构建一个小型应用程序时,使用代码隐藏或数据绑定来查看模型并没有太大的区别。很容易理解流程以及何时进行更新。但随着您的应用程序复杂性上升以及您需要测试代码,您开始使用模式使您的代码更易于维护和测试。这就是MVVM模式的来源。

在代码隐藏文件中测试代码比在ViewModel类中测试业务逻辑更难,并确保它按预期工作。

上面的示例有点简单,因为它是一个只显示文本但不接受输入的TextBlock。 TextBox是一个更好的绑定示例,因为数据可以在视图模型或UI中更改。绑定允许您使用属性支持显示的文本,因此从任何方向的更改都会自动更新模型属性和UI。

<TextBox x:Name="Entry" Text="{Binding SelectedValue , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

视图模型:

public class CatalogViewModel : BindableBase
{
    private string selectedValue;
    public string SelectedValue
    {
        get { return selectedValue; }
        set { SetProperty<string>(ref selectedValue, value); }
    }
...
}

替代方案是代码隐藏文件中的大量代码,以保持TextBox和数据元素之间的同步。

<TextBox x:Name="Entry2" TextChanged="Entry2_TextChanged" />

代码背后:

private string entryText;
public string EntryText
{
    get { return entryText; }
    set
    {
        if (value != entryText)
        {
            entryText = value;
            Entry2.Text = entryText;
        }
    }
}
private void Entry2_TextChanged(object sender, TextChangedEventArgs e)
{
    entryText = Entry2.Text;
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
    // initialize controls
    EntryText = "Default";
}

您现在已将业务逻辑与页面布局相结合,并且更改将导致大量更改。测试代码的行为更难编写,更难以模拟。

使用多个输入控件和更复杂的控件(如ListViews和GridViews)会变得更加复杂。

如果您对使用视图模型和数据绑定对它们的好处感兴趣,您应该阅读MVVM:https://msdn.microsoft.com/en-us/magazine/dd419663.aspx