Как переопределить способ, которым комбинированный список находит выбранный элемент в его источнике - PullRequest
2 голосов
/ 23 марта 2011

Учитывая следующий фрагмент XAML:

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

Может показаться, что если ViewModel назначает свое свойство CurrentItem экземпляру одного из ListOfItems, тогда ComboBox будет отображать правильные значения.

Однако, если ViewModel назначает CurrentItem «клону» экземпляра в ListOfItems, ComboBox не может найти SelectedItem в его ItemsSource, и поэтому выбранный элемент не отображается.

Как переопределить способ, которым ComboBox находит свой selectedItem в своих ListOfItems, чтобы он работал по значению, а не по ссылке.

1 Ответ

2 голосов
/ 23 марта 2011

Рассматривали ли вы перезапись метода Equals в связанных объектах?Это будет работать;)

Вы также можете добавить свойство SelectedValue к модели представления и добавить SelectedValuePath и SelectedValue с привязкой TwoWay к вашему представлению.Вот быстрый пример: Вид:

<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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...