【问题标题】:TwoWay Binding to ListBox SelectedItem on more than one list box in WPF双向绑定到 WPF 中多个列表框上的 ListBox SelectedItem
【发布时间】:2011-01-27 22:20:18
【问题描述】:

我有一个场景,我有一个全局可用的属性窗口(类似于 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 保持不变。这样一来,绑定就变得不同步了。

是否有人知道当 SelectedObject 不在列表中时确保列表框重置其 SelectedItem 的方法?有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: c# wpf data-binding listbox


    【解决方案1】:

    丹的回答也帮助我解决了我的问题。看起来关键是让绑定对象首先重新绑定到空值,然后再重新绑定到新值。

    我的解决方案中没有 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
    

    【讨论】:

      【解决方案2】:

      好吧,我找到了解决这个问题的方法,但这让我有点不舒服。我将模型中的 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);
              }
          }
      }
      

      这会强制所有数据绑定列表控件在我们更新为“真正的”SelectedObject 之前将其 SelectedItem 重置为 null。附带说明一下,NotifyPropertyChanged 的​​东西正在由 PostSharp 处理,以防您想知道它为什么会丢失。

      如果可能的话,我更喜欢一个不那么骇人听闻的解决方案,但我确实喜欢这样一个事实,即这样可以使 XAML 中的绑定保持干净(无需更改。)

      【讨论】:

        猜你喜欢
        • 2011-02-01
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 2010-12-26
        相关资源
        最近更新 更多