2

アプリケーションとカスタム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を配置する必要がありますか?もしそうなら、どこでどのように?

4

1 に答える 1

1

これが私の解決策です:

1)ユーザーコントロールのdp:

public static readonly DependencyProperty SelectionListProperty = DependencyProperty.Register(
        "SelectionList",
        typeof(ObservableCollection<MyList>),
        typeof(MyUserControl),
        new UIPropertyMetadata(null));

(..プロパティのget / setラッパーを追加します)

2)リストにUserControls ItemsSourceを設定します。例:

_combobox.ItemsSource = SelectionList;

3)ホストがリストを所有します。ユーザーコントロールをインスタンス化するクラスにデータとそのプロパティを追加します。私の場合、読み取り専用/一方向バインディングを使用します。

ObservableCollection<MyList> _bigList= new ObservableCollection<MyList>();
public ObservableCollection<MyList> BigList
    {
        get { return _bigList; }
    }

4)xamlでバインディングを設定します

<myctrl:MyUserControl
    SelectionList="{Binding BigList, Mode=OneWay}"
     ...
 />

5)これで、_biglistを変更するたびに、「BigList」でPropertyChangedEventHandlerを呼び出します。これにより、バインディングによって設定されたUserControlのSelectionListが通知され、BigListget{}が呼び出されます。それがあなたに明らかであることを願っています。

于 2013-12-03T14:38:27.747 に答える