2015-09-29 2 views
-1

Недавно я просматривал код Джоша Смита (из его известной статьи MVVM), и я пытался создать следующую программу его идеальный шаблон MVVM.WPF - Как связать ViewModel с представлением с параметрами в XAML

Теперь вот проблема, в проекте MainWindowResources проекта Джоша Смита, он привязывает представление к (просто используя произвольное имя здесь) ExampleViewModel, поэтому TabControl (workspaces) показывает ExampleView, а не только .ToString() ExampleViewModel , Пример:

<DataTemplate DataType="{x:Type vm:ExampleViewModel}"> 
    <vw:ExampleView /> 
</DataTemplate> 

Обычно этот кусок кода будет работать, если представление не принимает никаких параметров. Но для этого проекта я беру в ViewModel в параметрах режима представления конструктора:

public ExampleView(ExampleViewModel viewModel) 
{ 
    InitializeComponent(); 
    DataContext = viewModel; 
} 

Так что теперь, я на стенде still- этого типа привязки позволяет только для параметра менее конструкторах.

Итак, как мне обойти эту проблему, сохраняя привязку вида к ViewModel, в котором у указанного представления есть параметры конструктора?

+0

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

+0

@PeterDuniho добавленная ссылка наверху не отвечает на этот вопрос. Но я согласен, что есть много вопросов, касающихся аспектов MVVM. –

+0

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

ответ

1

Я думаю, назначая DataContext через параметр не может застройщик быть хорошей идеей, так как это делается автоматически с помощью DataTemplate, но и для любого другого параметра, надеюсь, что ниже предложение поможет!
Первое первым, если вы хотите использовать ExampleView в XAML, то вам нужно иметь конструктор по умолчанию, поэтому выше конструктор (упомянутый в вашем вопросе) является не будет работать. Я предлагаю вам определить свойство зависимости с именем ViewModel в ExampleView, а затем использовать его из XAML. Что-то вроде этого:

public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register 
    (
     "ViewModel", 
     typeof(ExampleViewModel), 
     typeof(ExampleView), 
     new PropertyMetadata(null) 
    ); 

    public ExampleViewModel ViewModel 
    { 
     get { return (ExampleViewModel)GetValue(ViewModelProperty); } 
     set { SetValue(ViewModelProperty , value); } 
    } 

    public ExampleView() 
    { 
     InitializeComponent(); 
    } 
    //.......... 

}

Тогда вы можете написать это в XAML:

<vw:ExampleView ViewModel="{Binding}" /> 
+0

Спасибо! Я действительно не был представлен DepencyProperties и как они работают. Но я возьму это для гранита, это работает, и узнайте больше о том, как и почему это решение работает завтра. В любом случае, спасибо за ответ! –

+0

Добро пожаловать! если вам нужна помощь, не стесняйтесь связаться со мной :) –

Смежные вопросы