Двухстороннее связывание с ListBox SelectedItem в нескольких списках в WPF - PullRequest
4 голосов
/ 16 марта 2010

У меня есть сценарий, в котором у меня есть глобально доступное окно свойств (аналогичное окну свойств в Visual Studio), которое связано со свойством SelectedObject моей модели. У меня есть несколько различных способов просмотра и выбора объектов, поэтому моей первой попыткой было привязать их непосредственно к SelectedObject. Например:

<ListBox ItemsSource="{Binding ActiveProject.Controllers}" 
SelectedItem="{Binding SelectedObject, Mode=TwoWay}"/>

<ListBox ItemsSource="{Binding ActiveProject.Machines}" 
SelectedItem="{Binding SelectedObject, Mode=TwoWay}"/>

Это хорошо работает, когда в каждом списке больше одного элемента, но не получается, если в списке только один элемент. Когда я выбираю элемент, SelectedObject не обновляется, так как список все еще думает, что его оригинальный элемент был выбран. Я считаю, что это происходит потому, что двусторонняя привязка просто игнорирует обновление из источника, когда SelectedObject не является объектом в списке, оставляя SelectedItem списка без изменений. Таким образом, привязки становятся несинхронными.

Кто-нибудь знает способ убедиться, что поля списка сбрасывают свой SelectedItem, когда SelectedObject нет в списке? Есть ли лучший способ сделать это, не страдая от этой проблемы?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

Ответ Дэна также помог мне решить мою проблему. Похоже, что ключ заключается в том, чтобы привязанные объекты сначала привязывались к нулевому значению, а затем снова к новому значению.

В моем решении нет Postsharp или нет необходимости вести список выбранных объектов, это единственный код, который мне был нужен.

    Public Property MyProperty() As Object
        Get
            Return Me._MyProperty
        End Get
        Set(value As Object)
            Me._MyProperty = Nothing

            NotifyOfPropertyChange(Function() MyProperty)

            Me._MyProperty = value

            NotifyOfPropertyChange(Function() MyProperty)
        End Set
    End Property
1 голос
/ 16 марта 2010

Ну, я нашел способ обойти эту проблему, но это меня немного заболевает. Я изменил свойство SelectedObject в моей модели так:

public Object SelectedObject
{
    get
    {
        return _selectedObject;
    }
    set
    {
        if (value != _selectedObject)
        {
            //HACK
            //Pulse 'null' between changes to reset listening list controls
            if (value != null)
                SelectedObject = null;

            if (_selectedObject != null)
                SelectedObjects.Remove(_selectedObject);

            _selectedObject = value;
            if (value != null)
                SelectedObjects.Add(value);
        }
    }
}

Это вынуждает все элементы управления списком привязанных к данным сбросить их SelectedItem на ноль, прежде чем мы обновим «реальный» SelectedObject. Кроме того, PostSharp обрабатывает материал NotifyPropertyChanged на тот случай, если вам интересно, почему он отсутствует.

Я бы предпочел менее хакерское решение, если это возможно, но мне нравится тот факт, что это сохраняет чистые привязки в XAML (никаких изменений не требуется.)

...