C# XAML数据绑定清晰度

C# XAML数据绑定清晰度,c#,xaml,data-binding,uwp,C#,Xaml,Data Binding,Uwp,想看看有没有人能帮我把这件事弄清楚?从XAML元素数据绑定到ViewModel中的某个值(例如:1)或从CodeBehind(例如:2)数据绑定到元素(例如。。。主机名。文本 <TextBlock Text="{Binding HostName}" /> --- (ex:1) <TextBlock Name="HostName" /> --- (ex:2) 简单的答案是,这取决于您的应用程序和需求。在构建小型应用程序时,使用代码隐藏或数据绑定来查看模型并没有多大区别。很

想看看有没有人能帮我把这件事弄清楚?从XAML元素数据绑定到ViewModel中的某个值(例如:1)或从CodeBehind(例如:2)数据绑定到元素(例如。。。主机名。文本

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

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

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

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

<TextBox x:Name="Entry" Text="{Binding SelectedValue , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
现在,您已经将业务逻辑与页面布局结合起来,对其中任何一个的更改都将导致大量更改。测试代码的行为更难编写,也更难模仿

多个输入控件和更复杂的控件(如ListView和GridView)会使它变得更复杂


如果您对使用视图模型和数据绑定的好处感兴趣,您应该阅读MVVM:

我不确定我是否完全理解这个问题。示例1是人们所说的数据绑定-视图模型属性绑定到控件的文本属性。当两端的属性发生更改时,VM backing属性将更新(如果使用双向绑定并实现了INotifyPropertyChanged)。例2令人困惑。设置HostName.Text属性通常在代码隐藏文件(但不是视图模型)中,但这不是数据绑定。从ViewModel执行此操作意味着您的视图模型需要知道您的视图以及其中的特定文本块。这打破了MVVM模式。我修改了第二条语句以更好地反映您的更正。。。我想我想了解的是,你什么时候会选择一种方法而不是另一种?例如,ex:2支持双向绑定吗。。或者示例2甚至被认为不具有约束力?我想这是因为你没有绑定到控件的Text属性吗?很好的描述。。是的,我正在构建更复杂的东西,并且确实希望遵循MVVM逻辑。我在网上浏览了很多教程,读了很多文章,随着时间的推移,我开始越来越清晰了。我仍然没有一个哈哈哈的时刻。例如,现在我的所有数据库表都在Model目录中的POGO对象中表示。但是我并不总是清楚地了解如何在ViewModel中表示它们。谢谢。您是否在POCO类中使用实体框架?模型和视图模型如何交互是MVVM中争论的话题。如果您正在编辑客户列表(例如),您是在UI绑定中公开该模型类,还是将每个模型类包装到视图模型类中?我通常通过视图模型传递mode类(但不要复制它们)。因此,我的CustomerListViewModel有一个属性IList Customers,它绑定到XAML中的ListView。但这意味着您的模型类需要实现INotifyPropertyChanged以支持正确的数据绑定。我更新了我的原始帖子,以包含一个与其中一个数据库表对应的POCO类。这在使用实体框架的WebService项目中也是重复的。我试图在我的主要项目中使用它,但当我发现目前无法通过EF6或Core与SQL Server同步时,我不得不使用WebService。我想我可以从主项目中提取EF核心引用,因为它现在没有被使用。
<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 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";
}