Связывание с несколькими моделями представления - PullRequest
1 голос
/ 10 августа 2011

У меня есть view-модель для usercontrol, которая определена в шаблоне данных для view-модели. Я хотел бы связать свойство 'GridViewData' usercontrol со свойством 'Data' модели представления.

Я все еще новичок в WPF и ужасен в привязках, поэтому будьте добры: p

XAML:

<Window x:Class="ReportUtility.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:lite="clr-namespace:ReportUtility.Controls.LiteGrid"
    xmlns:vm="clr-namespace:ReportUtility.ViewModels"
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    Title="MainWindow" Height="350" Width="525">

<!--This is the view model I want to bind to variable name is Grid: hosted in the content control below-->
<Window.Resources>
    <DataTemplate DataType="{x:Type vm:LiteGridViewModel}">
        <lite:LiteGrid GridViewData="{Binding ??}"/>
    </DataTemplate>
</Window.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="50"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="150"/>
    </Grid.ColumnDefinitions>

    <Button Grid.Row="0" Content="TestButton" HorizontalAlignment="Stretch" Command="{Binding ExecuteQueryCommand}"/>
    <TextBox Grid.Row="1" Text="{Binding Path=SqlCommandText, UpdateSourceTrigger=PropertyChanged}"/>
    <ContentControl Content="{Binding Grid}" Grid.Row="2" Background="Red"/>

    <Border Background="Aqua" Grid.Column="1" Grid.RowSpan="3"/>
    <GridSplitter Grid.Column="0" Width="3" Grid.RowSpan="3"/>
</Grid>

1 Ответ

4 голосов
/ 10 августа 2011

Вы бы связались с Data

<DataTemplate DataType="{x:Type vm:LiteGridViewModel}">
    <lite:LiteGrid GridViewData="{Binding Data}"/>
</DataTemplate>

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

<UserControl GridViewData="{Binding Data}">
    ...
</UserControl>

Ваши привязки всегда ссылаются на текущий объект DataContext.Поскольку ваш DataTemplate предназначен для типа LiteGridViewModel, DataContext внутри этого DataTemplate всегда будет иметь тип LiteGridViewModel.

Например, если у вас есть класс, такой как

public class MyClassA
{
    MyClassB ClassB {get; set;}
}

public class MyClassB 
{
    MyClassC ClassC {get; set;}
}

И свойство ViewModel MyClassA ClassA (что означает, что вы можете ссылаться на ClassA.ClassB.ClassC), вы можете сделать что-то вроде

<ContentControl Content="{Binding ClassA}">
    <ContentControl Content="{Binding ClassB}"> <!-- DataContext is MyClassA -->
        <ContentControl Content="{Binding ClassC}"> <!-- DataContext is MyClassB -->
            <!-- DataContext is MyClassC -->
        </ContentControl>
    </ContentControl>
</ContentControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...