[英]TwoWay Binding to ListBox SelectedItem on more than one list box in WPF
我有一個場景,我有一個全局可用的屬性窗口(類似於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的方法? 有沒有更好的方法來做到這個沒有這個問題?
Dan的回答幫助我解決了我的問題。 看起來好像關鍵是綁定對象首先重新綁定為空值,然后再重新綁定到新值。
在我的解決方案中沒有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
好吧,我找到了繞過這個問題的方法,但這讓我有些不適。 我將模型中的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。 另外,PostSharp正在處理NotifyPropertyChanged的內容,以防你想知道為什么它丟失了。
如果可能的話,我更喜歡一個不太討厭的解決方案,但我確實喜歡這樣一個事實:這樣可以保持XAML中的綁定清晰(無需更改)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.