0
我創建了一個用戶控件(FilterPicker
),它具有某個列表作爲屬性。這是一個依賴項屬性,因此可以在使用用戶控件時進行設置。從XAML(WPF)設置集合DependencyProperty
public static readonly DependencyProperty StrategiesProperty = DependencyProperty.Register(
"Strategies",
typeof(List<FilterType>),
typeof(FilterPicker),
new FrameworkPropertyMetadata
{
DefaultValue = new List<FilterType> { FilterType.Despike },
PropertyChangedCallback = StrategiesChangedCallback,
BindsTwoWayByDefault = false,
});
然後我試圖在我使用這個控件的.xaml文件中定義這個列表。
<Filtering:FilterPicker Grid.Row="1" Strategy="{Binding Strategy}">
<Filtering:FilterPicker.Strategies>
<Filtering1:FilterType>PassThrough</Filtering1:FilterType>
<Filtering1:FilterType>MovingAverage</Filtering1:FilterType>
<Filtering1:FilterType>Despike</Filtering1:FilterType>
</Filtering:FilterPicker.Strategies>
</Filtering:FilterPicker>
但是,它不起作用。 StrategiesChangedCallBack
永遠不會被調用。 如果我通過綁定來設置它,它工作正常 - 只是當我嘗試在xaml中定義它時。所以這個作品:
<Filtering:FilterPicker Grid.Row="1" Strategy="{Binding Strategy}" Strategies="{Binding AllStrategies}">
但不是以前的代碼片段。關於我在做什麼的任何想法都是錯誤的?
在XAML中添加的元素被添加到現有的集合,它已設置爲屬性的默認值。集合實例不會更改,因此不會調用PropertyChangedCallback。您可以使用實現INotifyCollectionChanged接口(例如ObservableCollection)的集合,併爲其CollectionChanged事件附加處理程序,而不是List。 – Clemens
除此之外,對集合類型依賴項屬性使用默認值有潛在危險,因爲擁有的類的所有實例將默認在相同的集合實例上操作,即向一個FilterPicker的Strategies屬性中添加元素將影響屬性所有其他FilterPickers。 – Clemens
有關如何處理INotifyCollectionChanged,請參閱示例[此答案](http://stackoverflow.com/a/9128855/1136211)或[this one](http://stackoverflow.com/a/19558932/1136211)。 – Clemens