给出以下XAML片段:
<ComboBox ItemsSource={Binding ListOfItems} SelectedItem={Binding CurrentItem, Mode=TwoWay}/>
如果ViewModel将其CurrentItem属性分配给其中一个ListOfItems的实例,那么ComboBox似乎会显示正确的值。
但是,如果ViewModel将CurrentItem分配给ListOfItems中实例的“克隆”,则ComboBox无法在其ItemsSource中找到SelectedItem,因此不会显示所选项目。
如何覆盖ComboBox在其ListOfItems中找到selectedItem的方式,使其按值运行,而不是通过引用运行。
答案 0 :(得分:2)
您是否考虑过覆盖绑定对象中的Equals方法? 那会有用;)
您还可以将SelectedValue属性添加到视图模型,并将SelectedValuePath和SelectedValue与TwoWay Binding一起添加到视图中。 这是一个简单的例子: 视图:
<UserControl.Resources>
<SilverlightApplication2:TestCollection x:Key="TestCollection" />
<SilverlightApplication2:TestSelectedItem x:Key="TestSelectedItem"/>
</UserControl.Resources>
<Grid
x:Name="LayoutRoot"
Background="White">
<ComboBox
DisplayMemberPath="Text"
SelectedValuePath="Id"
SelectedValue="{Binding SelectedValue, Source={StaticResource TestSelectedItem}, Mode=TwoWay}"
Height="25"
DataContext="{StaticResource TestCollection}"
ItemsSource="{Binding Tests}"
SelectedItem="{Binding SelectedItem}"/>
</Grid>
快速而肮脏的代码;)
public class Test
{
public int Id { get; set; }
public string Text { get; set; }
}
public class TestCollection
{
public ObservableCollection<Test> Tests { get; set; }
public TestCollection()
{
this.Tests = new ObservableCollection<Test>();
Tests.Add(new Test{ Id = 1, Text = "one"});
Tests.Add(new Test { Id = 2, Text = "two" });
Tests.Add(new Test { Id = 3, Text = "three" });
}
}
public class TestSelectedItem
{
public Test SelectedItem { get; set; }
private int _selectedValue;
public int SelectedValue
{
get { return _selectedValue; }
set { _selectedValue = value; }
}
public TestSelectedItem()
{
SelectedItem = new Test {Id = 2, Text = "two"};
SelectedValue = 2;
}
}
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
}
希望这有帮助。
BR,
TJ