Как сделать два независимых экземпляра ControlTemplate в окне? - PullRequest
0 голосов
/ 10 марта 2012

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

    <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 голосов
/ 11 марта 2012

Как вы используете шаблон управления? К какому контролю вы прикрепляете этот шаблон? Это шаблон для пользовательского элемента управления у вас есть? Это шаблон для известного элемента управления?

Как создать экземпляр 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>
...