アプリケーションとカスタムUsercontrolの間でリストを共有するのが好きです。添付プロパティとしてIEnumerableを使用して、カスタムUserControl内のリストボックスにリストを提供します。次に、ListBoxは添付されたプロパティをItemsSourceとして受け取ります。これは今のところ機能します。ただし、ホストリストが変更されると、usercontrol内のリストが更新されます。どうすればこれを達成できますか?現在のコードはUsercontrolリストを設定しますが、ホストがリストを変更しても、添付されたプロパティは更新されません。
UserControlを使用するホストにはComboBoxがあり、ItemsSourceをUserControlのListBoxと共有する必要があります
public ObservableCollection<Person> PersonList
{
get;
set;
}
ホストのXamlは、ComboBoxをコレクションにバインドします。
<ComboBox x:Name="combobox1" Width="200" ItemsSource="{Binding PersonList}" DisplayMemberPath="Name" SelectedIndex="0" IsEditable="True"></ComboBox>
ホスト内に配置されたUsercontrolは、添付プロパティを介してコレクションを受け取ります。バインディングは重く見えますが、問題ないようです。
<myUserCtrl:AdvEditBox
...
prop:DynamicListProvider.DynamicList="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
Path=DataContext.PersonList}">
...
</myUserCtrl:AdvEditBox
アタッチされたプロパティにはコールバックがあり、現在は1回だけ呼び出されます。
class DynamicListProvider : DependencyObject
{
public static readonly DependencyProperty DynamicListProperty = DependencyProperty.RegisterAttached(
"DynamicList",
typeof(IEnumerable),
typeof(DynamicListProvider),
new FrameworkPropertyMetadata(null, OnDynamicListPropertyChanged)));
public static IEnumerable GetDynamicList(UIElement target) {..}
public static void SetDynamicList(UIElement target, IEnumerable value) {..}
private static void OnDynamicListPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue != null && o is FrameworkElement)
{
...
}
}
OnDynamicListPropertyChanged()は、ホストのPersonListが変更されるたびに呼び出す必要があります。添付プロパティ内にINotifyCollectionChangedを配置する必要がありますか?もしそうなら、どこでどのように?