gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:53:49 27 4
gpt4 key购买 nike

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

这就是我正在做的事情:

WPF:

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

请注意,我的 WindowDataContext{BindingrelativeSource={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 组合框绑定(bind)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18111670/

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