- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是 ComboBox
没有显示存储在其绑定(bind)列表中的值。
这是我正在做的:
WPF:
<ComboBox ItemsSource="{Binding Devices}"
DropDownOpened="deviceSelector_DropDownOpened"/>
请注意,我的 Window
的 DataContext
是 {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
(因为您的 View
是 DependencyObject
:
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/
我正在尝试根据我的 RadGridView(编辑:OrderList)中当前选定的行更改我的 RadContextMenu 上的项目。如果当前行中的数据绑定(bind)项目具有正确的属性值,我希望启用
我的问题是ComboBox没有显示存储在其绑定(bind)列表中的值。 这就是我正在做的事情: WPF: 请注意,我的 Window 的 DataContext 是 {Bindingrelative
我的问题是 ComboBox 没有显示存储在其绑定(bind)列表中的值。 这是我正在做的: WPF: 请注意,我的 Window 的 DataContext 是 {Binding Relative
我是一名优秀的程序员,十分优秀!