2010-03-16 2 views
4

У меня есть сценарий, в котором у меня есть глобальное окно свойств (похожее на окно свойств в Visual Studio), которое привязано к свойству SelectedObject моей модели. У меня есть несколько разных способов просмотра и выбора объектов, поэтому первая попытка - связать их с SelectedObject напрямую. Например:TwoWay Binding to ListBox SelectedItem в нескольких списках в WPF

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

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

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

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

ответ

1

Ну, я нашел способ обойти проблему, но это заставляет меня слегка болеть. Я изменил свойство 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. С другой стороны, материал NotifyPropertyChanged обрабатывается PostSharp, если вам интересно, почему он отсутствует.

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

3

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

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

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