我有一个带有文本框和按钮的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");
}
}
现在我想在一个窗口中创建该控件的两个独立实例,但是当我为第一个实例选择一个值时,它们都已被更改。我应该定义两个属性吗?我怎样才能将它们绑定到控制模板? 我不确定每个人都能理解我的意思,所以我希望有人编辑我的问题:)
答案 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>