Совместное использование данных, не связанных с управлением, между WPF ViewModel и UserControl - PullRequest
0 голосов
/ 01 сентября 2011

Я новичок в WPF и шаблоне MVVM, так что имейте это в виду.

Проект, над которым мне поручено работать, имеет вид и модель вида. Представление также содержит пользовательский элемент управления, который НЕ имеет модели представления. Есть данные (пользовательский объект ... Порядок), которые передаются в модель представления, которые я также должен поделиться с пользовательским элементом управления.

Похоже, что UserControl обменивается данными между моделью представления уже через DependencyPropertys, но эти данные являются просто текстовыми полями в пользовательском элементе управления, которые выглядят привязанными к свойствам в модели представления.

Мне нужно поделиться данными, которые НЕ будут представлены элементом управления в пользовательском элементе управления. Есть ли хороший способ передать эти данные (сложный объект заказа)? Может быть, мне нужен какой-то скрытый контроль над моим пользовательским контролем, чтобы выполнить это, но я просто не уверен, что новичок в этом. Любой совет будет оценен.

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Вы можете просто создать свойство зависимости в классе вашего UserControl и привязать к нему в представлении, которое использует элемент управления.Нет необходимости внутренне связывать свойство зависимостей с одним из элементов управления в UserControl.

1 голос
/ 01 сентября 2011

Нет необходимости в скрытых полях (или любой другой концепции в WPF), так как вы можете добавить любые пользовательские свойства, которые вы хотите, в пользовательский элемент управления.

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

    public Order CurrentOrder
    {
        get { return (Order)GetValue(CurrentOrderProperty); }
        set { SetValue(CurrentOrderProperty, value); }
    }

    // Using a DependencyProperty as the backing store for CurrentOrder.  This enables binding, etc.
    public static readonly DependencyProperty CurrentOrderProperty =
        DependencyProperty.Register("CurrentOrder", typeof(Order), typeof(MyUserControl), new PropertyMetadata(null, OnCurrentOrderPropertyChanged));

    public static void OnCurrentOrderPropertyChanged(DependencyObject Sender, DependencyPropertyChangedEventArgs e)
    {
        var sender = Sender as MyUserControl;
        var NewValue = e.NewValue as Order;
        var OldValue = e.OldValue as Order;
        if (OldValue != null && sender != null)
        {
            //Use old value as needed and use sender instead of this as method is static.
        }
        if (NewValue != null && sender != null)
        {
            //Use new value as needed and use sender instead of this as method is static.
        }
    }

В родительском представлении, где вы используете usercontrol, вы пишете что-то вроде:

<local:MyUserControl CurrentOrder="{Binding ViewModelOrder}" />

Где CurrentOrder - свойство зависимости для usercontrolа ViewModelOrder - это имя свойства в модели представления, которое необходимо заменить на локальное: MyUserControl на имя элемента управления / пространство имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...