我遇到了一个组合框问题。
<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线? (我需要一条像属性那样的线......)
答案 0 :(得分:0)
我找到了解决方案:
我必须覆盖所有对象的Equals(object obj)方法......
这足以解决问题。 在我看来,这是因为组合框无法在集合中找到正确的对象,因为它没有引用将对象与另一个对象进行比较。
public override bool Equals(object obj)
{
return this.DisplayName==(obj as Dimension).DisplayName;
}