gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:34:27 25 4
gpt4 key购买 nike

我正在开发一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com