2009-06-29 1 views
6

Следующий код-за привязки работ для пользовательского элемента управления SmartFormView:Как я могу привязать этот вид к этой ViewModel?

Вид:

<UserControl x:Class="CodeGenerator.Views.PageItemManageSettingsView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:v="clr-namespace:CodeGenerator.Views" 
    xmlns:vm="clr-namespace:CodeGenerator.ViewModels" 
    Background="#ddd"> 

    <Grid Margin="10"> 
     <ScrollViewer DockPanel.Dock="Top"> 
      <StackPanel Margin="10"> 
       <v:SmartFormView/> 
      </StackPanel> 
     </ScrollViewer> 
    </Grid> 

</UserControl> 

Code-за:

using System.Windows.Controls; 
using CodeGenerator.ViewModels; 

namespace CodeGenerator.Views 
{ 
    public partial class SmartFormView : UserControl 
    { 
     public SmartFormView() 
     { 
      InitializeComponent(); 
      DataContext = new SmartFormViewModel("testing"); 
     } 
    } 
} 

Однако я хочу, чтобы привязать SmartFormView в свой SmartFormViewModel в ViewModel вызывающего View, а не жестко закодированного в код-сзади. Тем не менее, эти два подхода не являются обязательными:

<UserControl.Resources> 
<DataTemplate DataType="{x:Type vm:SmartFormViewModel}"> 
    <v:SmartFormView/> 
</DataTemplate> 
</UserControl.Resources> 

... 

<Grid Margin="10"> 
<ScrollViewer DockPanel.Dock="Top"> 
    <StackPanel Margin="10"> 
     <TextBlock Text="{Binding Testing}"/> 
     <v:SmartFormView DataContext="{Binding SmartFormViewModel}"/> 
     <ContentControl Content="{Binding SmartFormViewModel}"/> 
    </StackPanel> 
</ScrollViewer> 
</Grid> 

В ViewModel у меня есть «Тестирование» и «SmartFormViewModel» определяется как свойствами ViewModel и заполнить их обоих (как показано ниже), но хотя тестирование свойство связывает штраф, тем SmartFormView не связывается с его SmartFormViewModel:

private SmartFormViewModel _smartFormViewModel=; 
public SmartFormViewModel SmartFormViewModel 
{ 
    get 
    { 
     return _smartFormViewModel; 
    } 
    set 
    { 
     _smartFormViewModel = value; 
     OnPropertyChanged("SmartFormViewModel"); 
    } 
} 

private string _testing; 
public string Testing 
{ 
    get 
    { 
     return _testing; 
    }  
    set 
    { 
     _testing = value; 
     OnPropertyChanged("Testing"); 
    } 
} 

public PageItemManageSettingsViewModel(MainViewModel mainViewModel, PageItem pageItem) 
    : base(mainViewModel, pageItem) 
{ 
    SmartFormViewModel SmartFormViewModel = new SmartFormViewModel("manageSettingsMain"); 
    Testing = "test ok"; 
} 

Что такое синтаксис для связывания UserControl в XAML для конкретного ViewModel в вызов ViewModel View?

ответ

6

Может быть неправильно, но я думаю, что у вас просто ошибка в коде.

SmartFormViewModel SmartFormViewModel = new SmartFormViewModel("manageSettingsMain"); 

Должно быть:

SmartFormViewModel = new SmartFormViewModel("manageSettingsMain"); 

т.е.. Ваш SmartFormViewModelникогда не устанавливается. Поэтому привязка, которую вы имеете в своем родительском представлении, не находит.

В дополнение к этому, лучший способ сделать это просто придерживаться своего ребенка VM в визуальном дереве:

<ContentControl Content="{Binding SmartFormViewModel}"/> 

И использовать DataTemplate сделать разрешение зрения, а не «жесткого кодирования «представление в виде, гм, родительский вид.

+0

Да, это было так, спасибо, что нашли, что приятно видеть, хорошо, поэтому я также попробовал свой второй способ, и это хорошо работает, и это имеет для меня больше смысла, поэтому вы, кажется, «определяете пустые области», которые затем заполняются ViewModels динамически, которые автоматически привязываются к соответствующим DataTemplates при рендеринге, имеют смысл, приятно, спасибо! –