Обновление ComboBox SelectedItem из кода позади - PullRequest
1 голос
/ 30 ноября 2011

У меня есть View с ComboBox, привязанным к моему свойству viewModel.Все работает нормально, но я на самом деле хочу повторно использовать мой вид и нужно обновить элементы управления с заданным значением.Установка свойства не будет обновлять визуальный интерфейс даже до события, и все выглядит хорошо.

Все работает, принимает визуальный интерфейс ComboBox.

Советы?!

Элемент управления XAML

<telerik:RadComboBox 
            ItemTemplate="{StaticResource SelectUserComboBoxTemplate}"
            SelectedItem="{Binding Path=SelectedUser, Mode=TwoWay,
            UpdateSourceTrigger=PropertyChanged}" 
            ItemsSource="{Binding Path=C_users}" 
            telerik:TextSearch.TextPath="displayName"
            Name="radComboBox1" 
            Margin="14,12,0,0" 
            Height="31" 
            VerticalAlignment="Top" 
            HorizontalAlignment="Left" 
            Width="253" 
            TextSearchMode="Contains"
            IsEditable="True"
            OpenDropDownOnFocus="True" 
            IsFilteringEnabled="True"
            >
    </telerik:RadComboBox>

Перегруженный конструктор, который задает значения

    public TicketControlTabViewModel(ticket t)
    {
        activeTicket = t;
        SelectedUser = customerServiceClient.getUser(t.customer_users.id);
        MetaString = t.meta;
        Description = t.description;
        ActiveId = t.id.ToString();
        Selected_priority = t.priority;
        SelectedStatus = t.status;
        this.RefreshC_users();
        this.RefreshSupportDepartments();
        this.RefreshSupportUsers();
    }

Свойство в моей модели представления

    private customer_users selectedUser { get; set; }
    public customer_users SelectedUser
    {

        get {
            return this.selectedUser;
            }
        set {
              if (value != null){
              this.selectedUser = value;
              this.UpdateCustomerDepartment(value);
              this.OnPropertyChanged("SelectedUser");
              SaveTicket();
              }

            }
    }

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

По умолчанию WPF сравнивает SelectedItem по ссылке, а не по значению. Это означает, что если SelectedItem не является тем же объектом в памяти, что и элемент в вашем ItemsSource, то сравнение вернет false и элемент не будет выбран.

Например, это, вероятно, не будет работать

MyCollection = new ObservableCollection<User>(DAL.GetUsers());
SelectedUser = DAL.GetUser(1);

однако это будет:

MyCollection = new ObservableCollection<User>(DAL.GetUsers());
SelectedUser = MyCollection.FirstOrDefault(p => p.Id == 1);

Это потому, что во втором примере SelectedUser устанавливает элемент, который фактически существует в MyCollection, тогда как в первом примере это может быть не так. Даже если данные одинаковы, они ссылаются на разные объекты в памяти.

Если выбранный вами элемент не ссылается на тот же элемент в памяти, что и ваш элемент ItemsSource, то либо используйте SelectedValue и SelectedValuePath, чтобы связать выбранный по умолчанию выбор вашего ComboBox, либо перезапишите метод .Equals() вашего класса для возврата Значение true, если данные в сравниваемых объектах совпадают.

public override bool Equals(object obj)
{
    if (obj == null || !(obj == MyClass))
        return false; 

    return ((MyClass)obj).Id == this.Id);
}
1 голос
/ 30 ноября 2011

Это может произойти, если в коллекции Items нет элемента, равного SelectedItem.Проверьте, есть ли у вас такой предмет (может быть, вы просто забыли перегрузить Equals в своем классе, и он использует сравнение ссылок)

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