当从组合框中选择一个值时,不会显示任何内容

本文关键字:任何内 显示 一个 组合 选择 | 更新日期: 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发出信号,表明属性已设置为新值,并且绑定到该值的任何控件都应刷新。