WPF - 在XAML中绑定由代码后台创建的对象

3

一个在代码(比如 C#)中创建的对象能否用于 XAML 数据绑定呢?

例如:

public class MyForm
{
    private MyComplexObject complexObject;

    public MyForm()
    {
        InitializeComponent();
    }

    public OnButtonClick(object sender, RoutedEventArgs e)
    {
        complexObject = new MyComplexObject();
    }
}

complexObject直到点击按钮后才会被创建。但是一旦单击该按钮,我希望绑定到complexObject.ID的文本框开始显示ID。

如果可能的话,我想在XAML中实现这个目标。

这可以做到吗?如果可以,怎么做?

2个回答

9
是的,这是可以实现的,通过绑定到一个你更新所需值的属性。我建议您了解MVVM模式(Model-View-ViewModel),它非常适用于使用WPF进行良好结构化。查看此视频以获得良好概述:MVVM视频 使用MVVM,您将创建一个类作为ViewModel类。这个类通常会被设置为View的DataContext。这样做后,您可以向类的其他属性添加动态引用,例如将文本字段绑定到某个属性,该属性保存ComplexObject的ID。如果您的ViewModel类有一个ComplexObject属性,该属性又有一个ID属性,您只需像这样绑定对象即可:
<TextBlock Text="{Binding ComplexObject.ID}" /> 

有了这个,你就可以通过鼠标点击触发ComplexObject的创建,最好将其设置为命令绑定。还要注意,ViewModel类(或持有ComplexObject的任何人)在设置对象后需要通知View。这可以通过将ComplexObject设置为DependencyProperty或通过使持有属性的类实现INotifyPropertyChanged接口 - 给它PropertyChanged函数来触发更改事件。我更喜欢后者。


2

一种可能的方法是让你的XAML绑定到代码后台的属性上。如果complexObject!= null,则该属性的getter将返回complexObject.ID。否则,它将返回“默认值”,无论是null还是0或default(ID类型)。同样,如果complexObject不为null,则该属性的setter将把value分配给complexObject.ID。

public int ID
{
    get
    {
        if (complexObject != null)
            return complexObject.ID;
        return 0; // or null or some appropriate default
    }
    set
    {
        if (complexObject != null)
            complexObject.ID = value;
    }
}

+1本来想建议实例化一个包含MyComplexObject对象的包装器对象,但你的方法更干净 :) - kiwipom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接