如何覆盖组合框在其itemssource中找到selecteditem的方式

时间:2011-03-23 13:45:31

标签: silverlight data-binding mvvm

给出以下XAML片段:

<ComboBox ItemsSource={Binding ListOfItems} SelectedItem={Binding CurrentItem, Mode=TwoWay}/>

如果ViewModel将其CurrentItem属性分配给其中一个ListOfItems的实例,那么ComboBox似乎会显示正确的值。

但是,如果ViewModel将CurrentItem分配给ListOfItems中实例的“克隆”,则ComboBox无法在其ItemsSource中找到SelectedItem,因此不会显示所选项目。

如何覆盖ComboBox在其ListOfItems中找到selectedItem的方式,使其按值运行,而不是通过引用运行。

1 个答案:

答案 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