wpf - 为特定控件设置 WPF 数据上下文

标签 wpf xaml data-binding datacontext

我正在开发一个 WPF 应用程序,我正在努力了解 DataContext 的一些细节,因为它适用于绑定(bind)。我的应用程序使用如下定义的业务对象:

public class MyBusinessObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }

    // enumerations for some properties
    public enum MyEnumValues
    {
        [Description("New York")]
        NewYork,
        [Description("Chicago")]
        Chicago,
        [Description("Los Angeles")]
        LosAngeles
    }

    // an example property
    private string _myPropertyName;
    public string MyPropertyName
    {
        get { return _myPropertyName; }
        set
        {
            if (_myPropertyName == value)
            {
                return;
            }

            _myPropertyName = value;
            OnPropertyChanged(new PropertyChangedEventArgs("MyPropertyName"));
        }
    }

    // another example property
    private MyEnumValues _myEnumPropertyName;
    public MyEnumValues MyEnumPropertyName
    {
        get { return _myEnumPropertyName; }
        set
        {
            if (_myEnumPropertyName== value)
            {
                return;
            }

            _myEnumPropertyName= value;
            OnPropertyChanged(new PropertyChangedEventArgs("MyEnumPropertyName"));
        }
    }

    // example list property of type Widget
    public List<Widget> MyWidgets { get; set; }

    // constructor
    public MyBusinessObject()
    {
        // initialize list of widgets
        MyWidgets = new List<Widget>();

        // add 10 widgets to the list
        for (int i = 1; i <= 10; i++)
        {
           MyWidgets.Add(new Widget());
        }

        // set default settings
        this.MyPropertyName = string.empty;
    }
}

如您所见,我在此类中声明了一些属性,其中一个是小部件列表。 Widget 类本身也实现了 INotifyPropertyChanged 并公开了大约 30 个属性。

我的 UI 有一个组合框,它绑定(bind)到我的小部件列表,如下所示:

MyBusinessObject myBusinessObject = new MyBusinessObject();

public MainWindow()
{
    InitializeComponent();

    this.DataContext = myBusinessObject;

    selectedWidgetComboBox.ItemsSource = myBusinessObject.MyWidgets;
    selectedWidgetComboBox.DisplayMemberPath = "WidgetName";
    selectedWidgetComboBox.SelectedValuePath = "WidgetName";
}

我的 UI 上的大部分控件都用于显示 Widget 的属性。当我的用户从组合框中选择一个 Widget 时,我希望这些控件显示所选 Widget 的属性。我目前通过在组合框的 SelectionChanged 事件处理程序中更新窗口的 DataContext 来实现此行为,如下所示:

private void selectedWidgetComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    this.DataContext = selectedWidgetComboBox.SelectedItem;
}

这允许我像这样将我的控件绑定(bind)到适当的 Widget 属性:

<TextBox Text="{Binding WidgetColor}"></TextBox>

但是,并非我的 UI 中的所有控件都用于显示 Widget 属性。一些控件需要显示来自 MyBusinessObject 的属性(例如:上面定义的 MyPropertyName)。在这种情况下,我不能简单地说:

<TextBox Text="{Binding MyPropertyName}"></TextBox>

...因为窗口的 DataContext 指向选定的 Widget 而不是 MyBusinessObject。谁能告诉我如何为特定控件(在 XAML 中)设置 DataContext 以引用 MyPropertyName 是 MyBusinessObject 的属性这一事实?谢谢!

最佳答案

与其更改窗口的 DataContext,不如向 MyBusinessObject 类添加一个属性,如下所示:

private Widget _selectedWidget;
public Widget SelectedWidget
{
    get { return _selectedWidget; }
    set
    {
        if (_selectedWidget == value)
        {
            return;
        }

        _selectedWidget = value;
        OnPropertyChanged(new PropertyChangedEventArgs("SelectedWidget"));
    }
}

然后将 SelectedWidget 绑定(bind)到组合框的 SelectedItem 属性。在任何需要使用小部件属性的地方,您都可以这样做:

<TextBox Text="{Binding Path=SelectedWidget.WidgetColor}"></TextBox>

关于wpf - 为特定控件设置 WPF 数据上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20479770/

相关文章:

c# - 填充矩形的外部

c# - WPF SignalR 服务器返回 HTTP 400 错误请求(主机地址无效)

c# - Helix toolkit 旋转 3D 模型

c# - 通过 WCF 将 session 值传递给 silverlight?

c# - 如何将自闭标签添加到xml中的元素?

c# - NotifyPropertyChanged 依赖属性

c# - 图像 XAML 标记 (Win8) 不适用于某些路径

c# - 将 MenuItems 命令绑定(bind)到 UserControls DataContext

asp.net - 除 MS-SQL 外,是否有任何适用于数据库的 linq-to-sql?

wpf - 有哪些方法可用于 WPF 中的虚拟设计时数据?