当从组合框中选择一个值时,不会显示任何内容
本文关键字:任何内 显示 一个 组合 选择 | 更新日期: 2023-09-27 18:28:50
我正在声明一个类似于的组合框
<ComboBox ItemsSource="{Binding RenderableSeriesList, Mode=OneWay}" DisplayMemberPath="Tag" SelectedItem="{Binding SelectedRenderableSeries}" />
RenderableSeriesList是BaseRenderableSeries的可观察集合。BaseRenderableSeries是一个抽象类,它包含Tag属性,Tag属性是一个对象。TheRenderableSeriesList对象填充了所有从BaseRenderableSeries继承的类。
除了不显示所选项目外,其他一切都正常。选择某个内容时,SelectedRenderableSeries属性确实指向正确的内容。当组合框下降时,列表也是正确的。
我有点困惑为什么。。。
编辑:经过进一步调查,这可能是WPF本身的一个错误。
如果您尝试从Tag属性绑定,而该属性来自ContentControl,则它似乎无法正确绑定。
以下是一些演示代码:
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
if(this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public void AddItems()
{
TestObjects = new ObservableCollection<BaseTestObject>();
TestObjects.Add(new TestObject("one"));
TestObjects.Add(new TestObject("two"));
TestObjects.Add(new TestObject2("22two22"));
TestObjects.Add(new TestObject2("t22hree222"));
TestObjects.Add(new TestObject("three"));
TestObjects.Add(new TestObject("four"));
}
private ObservableCollection<BaseTestObject> _testObjects = new ObservableCollection<BaseTestObject>();
public ObservableCollection<BaseTestObject> TestObjects
{
get { return _testObjects; }
set
{
_testObjects = value;
this.NotifyPropertyChanged("TestObjects");
}
}
private BaseTestObject _testObject;
public BaseTestObject TestObject
{
get { return _testObject; }
set
{
_testObject = value;
this.NotifyPropertyChanged("TestObject");
}
}
}
// gets the Tag object property from FrameworkElement
// using FrameworkElement works....but ContentControl doesn't
public class BaseTestObject : ContentControl
{
//public object Tag { get; set; }
public string MyName { get; set; }
}
public class TestObject : BaseTestObject
{
string Name1 { get; set; }
public TestObject(string name)
{
Name1 = name;
Tag = name;
}
}
public class TestObject2 : BaseTestObject
{
string Name2 {get; set;}
public TestObject2(string name)
{
Name2 = name;
Tag = name;
}
}
<ComboBox Height="40" Width="250" ItemsSource="{Binding TestObjects, Mode=TwoWay}" DisplayMemberPath="Tag" SelectedItem="{Binding TestObject, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
据我所知,您的绑定属性在选择更改时会正确更新,但更改不会显示在屏幕上。为了更新屏幕上的项目,您必须在属性更新时调用NotifyPropertyChanged方法。这将向UI发出信号,表明属性已设置为新值,并且绑定到该值的任何控件都应刷新。