Как я могу привязать это представление к этой модели представления?

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

Просмотр:

<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>

Код программной части:

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 у меня есть "Testing" и "SmartFormViewModel", определенные как свойства ViewModel, и заполняю их оба (как показано ниже), но, хотя свойство Testing прекрасно связывает, свойство 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?


person Edward Tanguay    schedule 29.06.2009    source источник


Ответы (1)


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

SmartFormViewModel SmartFormViewModel = new SmartFormViewModel("manageSettingsMain");

Должно быть:

SmartFormViewModel = new SmartFormViewModel("manageSettingsMain");

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

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

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

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

person Kent Boogaart    schedule 29.06.2009
comment
да, именно так, спасибо, что нашли это, приятно видеть, хорошо, я также попробовал ваш второй способ, и он тоже хорошо работает, и это имеет больше смысла для меня, поэтому вы, кажется, определяете пустые области, которые затем заполняются ViewModels динамически, которые автоматически привязываются к соответствующим шаблонам данных при рендеринге, имеет смысл, хорошо, спасибо! - person Edward Tanguay; 29.06.2009