想知道是否有人可以帮我解决这个问题? 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}";
}
}
答案 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。