我有一個UserControl包含一個ListBox,我想跟蹤該列表框的SelectedItems。 的用戶控件有一個DP「SelectedItemsList」是這樣定義的綁定到usercontrol中的依賴屬性
public static DependencyProperty SelectedItemsListProperty = DependencyProperty.Register(
"SelectedItemsList",
typeof (IList),
typeof (MyListControl),
new FrameworkPropertyMetadata(null,
OnSelectedItemsChanged));
ListBox中的」項目‘的SelectionChanged’事件,我要保存所選項目到DP。每當我更改列表框中的選擇時,都會觸發它。
private void OnItemSelectionChanged(object sender, SelectionChangedEventArgs e)
{
SelectedItemsList = this.myListBox.SelectedItems;
}
在我看來,它包含要使用所選項目的「MyListControl」我創建綁定到我的視圖模型。
<controls:MyListControl
Source="{Binding SomeItemsList, UpdateSourceTrigger=PropertyChanged}"
SelectedItemsList="{Binding SelectedItems, UpdateSourceTrigger=PropertyChanged}"/>
我的問題是,DP SelectedItemsList永遠不會得到更新。 DP的PropertyChangeCallback「OnSelectedItemsChanged」僅在最初加載列表內容時觸發。 SelectedItemsList的值始終爲空。
我知道這個問題類似於Dependency property callback does not work,但在那裏發佈的答案並不能解決我的問題。
我在這裏錯過了什麼?
感謝,
編輯(2015年9月10日): 謝謝大家的意見。我找到了適合我需求的解決方案:
首先,我創建了一個自定義列表框控件,它提供依賴項屬性中的所選項目列表(非常類似於Select multiple items from a DataGrid in an MVVM WPF project)。
public class CustomListBox : ListBox
{
public static readonly DependencyProperty SelectedItemsListProperty =
DependencyProperty.Register("SelectedItemsList",
typeof (IList),
typeof (CustomListBox),
new PropertyMetadata(null));
public CustomListBox()
{
SelectionChanged += OnSelectionChanged;
}
public IList SelectedItemsList
{
get { return (IList)GetValue(SelectedItemsListProperty); }
set { SetValue(SelectedItemsListProperty, value); }
}
void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.SelectedItemsList= new ArrayList(this.SelectedItems);
}
}
我不是用「新的ArrayList」雙組分幸福了,但如果我的視圖模型的屬性setter我要檢查平等,SelectedItemsList不能SelectedItems的參考。以前和新的價值將永遠是一樣的。
然後我我的用戶「MyListControl」的項目選擇部分減少單純依賴屬性本身:
public static DependencyProperty SelectedItemsProperty = DependencyProperty.Register(
"SelectedItems",
typeof (IList),
typeof (MyListControl),
new FrameworkPropertyMetadata(null));
public IList SelectedItems
{
get
{
return (IList)GetValue(SelectedItemsProperty);
}
set
{
SetValue(SelectedItemsProperty, value);
}
}
和修改MyListControl的XAML:
<controls:CustomListBox
SelectionMode="Extended"
ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:MyListControl}},
Path=Source, UpdateSourceTrigger=PropertyChanged}"
SelectedItemsList="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:MyListControl}},
Path=SelectedItems, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
>
該物業在我ViewModel看起來像
public IList SelectedObjects
{
get { return _selectedObjects; }
set { if (this._selectedObjects != value)
{
this._selectedObjects = value;
OnPropertyChanged(SelectedObjectsProperty);
}
}
}
重要的是,類型o f這個屬性是IList,否則setter中的值將始終爲空。
並在視圖的XAML
<controls:MyListControl
Source="{Binding CurrentImageList, UpdateSourceTrigger=PropertyChanged}"
SelectedItems="{Binding SelectedObjects, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>
[Dependency property callback does not work]的可能重複(http://stackoverflow.com/questions/6584463/dependency-property-callback-does-not-工作) –
當我添加「SelectedItemsList = null;」在「OnItemSelectionChanged」中的常規設置之前,propertychangecallabck被觸發(對於這兩個集合),但對我的ViewModel的綁定仍然始終包含「null」。 – tabina