Как привязать usercontrol к приложениям viewmodel - PullRequest
1 голос
/ 15 июня 2011

Я использую стандартный шаблон поворота в своем приложении WP7.

У меня есть класс MainViewModel, определенный с несколькими дополнительными свойствами:

public class MainViewModel : INotifyPropertyChanged
{
    ...
    private MyClass selectedKey_m;
    public MyClass SelectedKey
    {
        get
        {
            ...
        }
        set
        {
            if (value != this.selectedKey_m)
            {
                this.selectedKey_m = value;
                NotifyPropertyChanged("SelectedKey");
            }
        }
    }
}

Класс App имеет экземпляр модели представления:

private static MainViewModel viewModel = null;
public static MainViewModel ViewModel
{
    get
    {
        // Delay creation of the view model until necessary
        if (viewModel == null)
            viewModel = new MainViewModel();

        return viewModel;
    }
}

My MainPage.xaml.cs устанавливает DataContext:

DataContext = App.ViewModel;

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

Моя проблема в том, что у меня есть собственный пользовательский элемент управления со свойством bindable, привязанный к свойству SelectedKey модели представления, но свойство в моем пользовательском элементе управления никогда не устанавливается, когда обновляется модель представления, и я не могу понять почему.

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

public partial class MyUserControl : UserControl
{
    public static readonly DependencyProperty SelectedKeyProperty = DependencyProperty.Register(
        "SelectedKey", typeof(MyClass), typeof(MyUserControl), new PropertyMetadata(null));

    public MyClass SelectedKey
    {
        get { return (MyClass)this.GetValue(SelectedKeyProperty); }
        set { this.SetValue(SelectedKeyProperty, value); }
    }    
}

И вот xaml на моей главной странице:

<local:MyUserControl x:Name="myUC" SelectedKey="{Binding Path=SelectedKey}">

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

Я также пытался установить текст данных моего пользовательского элемента управления в xaml:

DataContext="{Binding Path=App.ViewModel}"

Ответы [ 2 ]

0 голосов
/ 17 июня 2011

решаемая. Мне пришлось добавить статический метод, как предложил ptauzen , но также удалить оператор связывания DataContext из моего xaml:

DataContext="{Binding Path=App.ViewModel}"

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

SelectedKey="{Binding SelectedKey}"
0 голосов
/ 15 июня 2011

Отладчик не входит в сеттер, не знаю почему.

Попробуйте добавить обратный вызов, вызванный при изменении значения свойства:

public static readonly DependencyProperty SelectedKeyProperty = DependencyProperty.Register(
        "SelectedKey", typeof(MyClass), typeof(MyUserControl), new PropertyMetadata(MyPropertyChanged));

private static void MyPropertyChanged( object sender, DependencyPropertyChangedEventArgs args)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...