WPF Combobox,从ItemsSource重新创建的SelectedItem对象

时间:2016-08-11 09:14:43

标签: c# wpf combobox

我遇到了一个组合框问题。

<ComboBox ItemsSource="{Binding Path=DimensionsCollection}"  
          SelectedItem="{Binding CGEM.Dimension,Mode=TwoWay}" 
          Name="cb_Dimensions" 
          Width="140" Height="30" Foreground="Gray">
     <ComboBox.ItemTemplate>
          <DataTemplate DataType="Dimension">
               <TextBlock Background="Transparent" 
                          Text="{Binding DisplayName}"/>
          </DataTemplate>
     </ComboBox.ItemTemplate>
</ComboBox>

DimensionsCollection是在我的ViewModel中从xml配置文件构建的。

当我通过组合框选择尺寸时,我的&#34; CGEM.Dimension&#34;很新。

问题在另一方面......

我可以将我的CGEM保存在XML文件中,以便稍后重新加载。当我重新创建维度对象(使用XmlSerialiser)时,组合框没有升级......

重新更新组合框的唯一方法是用集合中相应的一个替换&#34; CGEM.Dimension&#34; ...不是真正的清洁解决方案......

using (StreamReader sr = new StreamReader(ofb.FileName))
{
     CGEMModel CGEMLoaded=(xs.Deserialize(sr) as CGEMModel);
     /* this line should be enough...*/
     this.CGEM = CGEMLoaded; 
     this.CGEM.Dimension = DimensionsCollection.Where(
          d => d.DisplayName == CGEMLoaded.Dimension.DisplayName
          ).First();         
}

我已在所有对象中实现了INotifyPropertyChanged ... 还有其他办法吗?一种更干净的方式,这将允许我擦除脏的linq线? (我需要一条像属性那样的线......)

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

我必须覆盖所有对象的Equals(object obj)方法......

这足以解决问题。 在我看来,这是因为组合框无法在集合中找到正确的对象,因为它没有引用将对象与另一个对象进行比较。

    public override bool Equals(object obj)
    {
        return this.DisplayName==(obj as Dimension).DisplayName;
    }