Привязка MVVM к пользовательскому элементу управления со свойством зависимостей ObservableCollection

Я разработал пользовательский элемент управления со свойством зависимостей ObservableCollection и хотел бы, чтобы оно использовалось легким приложением MVVM. Если я устанавливаю свойство в коде потребляющего представления позади, оно работает как шарм, но не так, когда я пытаюсь использовать связывание xaml, как и предполагалось с моделью представления.

В выделении кода элемента управления я определяю свойство зависимости:

/// <summary>
/// The <see cref="ItemsSource" /> dependency property's name.
/// </summary>
public const string ItemsSourcePropertyName = "ItemsSource";

/// <summary>
/// Gets or sets the value of the <see cref="ItemsSource" />
/// property. This is a dependency property.
/// </summary>
public List<string> ItemsSource
{
    get
    {
        return (List<string>)GetValue(ItemsSourceProperty);
    }
    set
    {
        SetValue(ItemsSourceProperty, value);
    }
}

/// <summary>
/// Identifies the <see cref="ItemsSource" /> dependency property.
/// </summary>
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(
    ItemsSourcePropertyName,
    typeof(List<string>),
    typeof(ListEditor), new PropertyMetadata(new List<string>(), OnItemsSourcePropertyChanged));

private static void OnItemsSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ListEditor listEditor = d as ListEditor;
    while (listEditor._stackPanel.Children.Count > 1)
    {
        listEditor._stackPanel.Children.RemoveRange(0, listEditor._stackPanel.Children.Count - 2);
    }

    List<string> newCollection = e.NewValue as List<string>;

    foreach (string item in newCollection)
    {
        ListItemEditor newItem = new ListItemEditor();
        newItem.Text = item;
        newItem.RemoveItem += listEditor.listItemEditor_RemoveItem;

        listEditor._stackPanel.Children.Insert(listEditor._stackPanel.Children.Count - 1, newItem);
    }
} 

В представлении я связываю элемент управления:

<ucl:ListEditor ItemsSource="{Binding PartNumbers}"/>

В модели представления я определяю свойство:

/// <summary>
/// The <see cref="PartNumbers" /> property's name.
/// </summary>
public const string PartNumbersPropertyName = "PartNumbers";

private ObservableCollection<string> _partNumbers = new ObservableCollection<string>();

/// <summary>
/// Sets and gets the PartNumbers property.
/// Changes to that property's value raise the PropertyChanged event. 
/// </summary>
public ObservableCollection<string> PartNumbers
{
    get
    {
        return _partNumbers;
    }

    set
    {
        if (_partNumbers == value)
        {
            return;
        }

        RaisePropertyChanging(PartNumbersPropertyName);
        _partNumbers = value;
        RaisePropertyChanged(PartNumbersPropertyName);
    }
}

Что я могу сделать, чтобы эффективно облегчить связывание?

0 ответов

Другие вопросы по тегам