gpt4 book ai didi

c# - 在 DropDownOpened 事件上设置的 WPF ComboBox 绑定(bind)列表

转载 作者:行者123 更新时间:2023-12-02 04:55:13 25 4
gpt4 key购买 nike

我的问题是 ComboBox 没有显示存储在其绑定(bind)列表中的值。

这是我正在做的:

WPF:

<ComboBox ItemsSource="{Binding Devices}" 
DropDownOpened="deviceSelector_DropDownOpened"/>

请注意,我的 WindowDataContext{Binding RelativeSource={RelativeSource Self}}

C# 代码隐藏:

public List<String> Devices { get; set; }

private void deviceSelector_DropDownOpened(object sender, EventArgs e)
{
// the actual population of the list is occuring in another method
// as a result of a database query. I've confirmed that this query is
// working properly and Devices is being populated.
var dev = new List<String>();
dev.Add("Device 1");
dev.Add("Device 2");

Devices = dev;
}

我已经尝试使用 ObservableCollection 而不是 List 来执行此操作,并且我还尝试过使用 PropertyChangedEventHandler。这些方法都不适合我。

知道为什么我单击下拉菜单时没有显示我的项目吗?

最佳答案

既然您是在代码隐藏中执行此操作,为什么不直接设置 ComboBox.ItemsSource

现在,我不会说这是在 WPF 中应该完成的方式(我更喜欢将 View 的数据加载到 ViewModel 中),但它会解决您的问题。

这不起作用的原因是因为您的属性在更改时没有通知绑定(bind)系统。我知道您说过您尝试过使用 PropertyChangedEventHandler,但除非您的 View 看起来像这样,否则它不会起作用:

public class MyView : UserControl, INotifyPropertyChanged
{
private List<String> devices;

public event PropertyChangedEventHandler PropertyChanged;

public List<String> Devices
{
get { return devices; }
set
{
devices = value;
// add appropriate event raising pattern
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Devices"));
}
}

...
}

同样,使用 ObservableCollection 只会像这样工作:

private readonly ObservableCollection<string> devices = new ObservableCollection<string>();

public IEnumerable<string> Devices { get { return devices; } }

private void deviceSelector_DropDownOpened(object sender, EventArgs e)
{
devices.Clear();
devices.Add("Device 1");
devices.Add("Device 2");
}

这两种方法都应该填充 ComboBox,在我刚刚运行的快速测试中,它起作用了。

编辑以添加 DependencyProperty 方法

最后一种方法是使用 DependencyProperty(因为您的 ViewDependencyObject:

public class MyView : UserControl
{
public static readonly DependencyProperty DevicesProperty = DependencyProperty.Register(
"Devices",
typeof(List<string>),
typeof(MainWindow),
new FrameworkPropertyMetadata(null));

public List<string> Devices
{
get { return (List<string>)GetValue(DevicesProperty); }
set { SetValue(DevicesProperty, value); }
}

...
}

关于c# - 在 DropDownOpened 事件上设置的 WPF ComboBox 绑定(bind)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18111670/

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