2014-10-31 49 views
0

我声明的组合框等:当一个值从组合框中选择的任何正在显示

<ComboBox ItemsSource="{Binding RenderableSeriesList, Mode=OneWay}" DisplayMemberPath="Tag" SelectedItem="{Binding SelectedRenderableSeries}" /> 

TheRenderableSeriesList是BaseRenderableSeries的的ObservableCollection。 BaseRenderableSeries是一个包含Tag属性的抽象类,Tag属性是一个对象。 TheRenderableSeriesList对象充满了所有继承自BaseRenderableSeries的类。

一切工作正常,但它不显示选定的项目。当选择某些内容时,SelectedRenderableSeries属性确实指向正确的一个。当组合框下降时,该列表也是正确的。

我有点困惑,为什么这...

编辑: 进一步调查,这可能是在WPF本身就是一个错误之后。

如果您尝试绑定来自ContentControl的Tag属性,它似乎不能正确绑定。

下面是一些代码演示:

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}" /> 

回答

0

据我了解,你是说,你的绑定属性更新正确选择何时更改,但更改不显示在屏幕上。为了使屏幕上的项目更新,必须在属性更新时调用NotifyPropertyChanged方法。这将向UI发出信号,表示属性已设置为新值,并且应该刷新与该值绑定的任何控件。

+0

他说SelectedRenderableSeries没有指向正确的值。在你的建议中,价值观是正确的,目标是让知道UI改变。 – Maximus 2014-10-31 19:56:51

+0

@Maximus不,他说*确实*指向正确的一个。它只是不显示。 – furkle 2014-10-31 19:57:40

+0

你是正确的。这似乎与绑定到ContentControl的Tag属性有关。 – ashlar64 2014-11-03 17:21:19

相关问题