如何在一个窗口中创建一个ControlTemplate的两个独立实例?

时间:2012-03-10 12:20:34

标签: binding mvvm mvvm-light controltemplate

我有一个带有文本框和按钮的controltemplate,按钮打开一个子表单来选择一些东西并在文本框中显示所选项目,如下所示:

    <Window.Resources>
    <ControlTemplate x:Key="CreateParam">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"/>
                <ColumnDefinition Width="1*"/>
                <ColumnDefinition Width="3*"/>
            </Grid.ColumnDefinitions>
            <Button Content="select" Command="{Binding ShowSpecItemViewommand}"  Grid.Column="0" Margin="2"/>
            <TextBox Margin="2" Text="{Binding Param}" Grid.Row="0" Grid.Column="1"/>
            <TextBlock Margin="5" Text="patameter" Grid.Row="0" Grid.Column="2"/>
        </Grid>
    </ControlTemplate>
    </Window.Resources>

我在viewmodel中有一个属性,如下所示:

 public string param;
    public string Param
    {
        get
        {
            return param;
        }
        set
        {
            param = value;
            RaisePropertyChanged("Param");
        }
    }

现在我想在一个窗口中创建该控件的两个独立实例,但是当我为第一个实例选择一个值时,它们都已被更改。我应该定义两个属性吗?我怎样才能将它们绑定到控制模板? 我不确定每个人都能理解我的意思,所以我希望有人编辑我的问题:)

1 个答案:

答案 0 :(得分:0)

您如何使用控制模板?您在哪个Control上附加此模板?它是您自定义控件的模板吗?它是已知控件的模板吗?

如何为控件模板实例化DataContext?

虽然你可以使用ControlTemplate(和一个自定义控件)实现你想要的东西,如果你有很多(即多于两个,并且遍布)对象的实例,ControlTemplate可能是正确的范例,你会最好使用 DataTemplate 或UserControl。有多种方法可以实现您的目标,但下面的代码被认为是“规范”解决方案:

Say Param是MyVM对象的属性。然后你的XAML文件应该是:

<Window
    x:Class="SO.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:so="clr-namespace:SO"
    Height="200" Width="350"
    Title="SO Sample"
    >
    <Window.Resources>
        <DataTemplate DataType="{x:Type so:MyVM}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="3*"/>
                </Grid.ColumnDefinitions>
                <Button Content="select" Command="{Binding ShowSpecItemViewommand}"  Grid.Column="0" Margin="2"/>
                <TextBox Margin="2" Text="{Binding Param}" Grid.Row="0" Grid.Column="1"/>
                <TextBlock Margin="5" Text="patameter" Grid.Row="0" Grid.Column="2"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>

    <StackPanel>
        <ContentControl>
            <so:MyVM Param="1234" />
        </ContentControl>
        <ContentControl>
            <so:MyVM Param="5678" />
        </ContentControl>        
    </StackPanel>

</Window>