大家好,我正在尝试更改dataGrid中列的模板,但我找不到在XAML中执行此操作的方法。我试图通过这种方式来做到这一点
<DataTemplate>
<DataTemplate.Triggers>
<Trigger Property="{Binding ElementName=isComboBox, Path=IsChecked}"
Value="True">
<Setter Property="VisualTree">
<Setter.Value>
<ComboBox ItemsSource="{Binding elementos}"/>
</Setter.Value>
</Setter>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
但是一个错误告诉我The property VisualTree cannot be set as a property element on template. Only Triggers and Storyboards are allowed as property elements
是否有人知道根据另一个控件在DataGridCell中更改模板的不同方式?
答案 0 :(得分:2)
您不会更改模板中的模板,这不是它的工作原理。
有很多方法可以做到这一点。取决于您的应用程序的配置方式。最常见的方法是
例如,您的应用程序中有几个模型
public sealed class Foo
{
public string Text {get;set;}
}
public sealed class Bar
{
public bool Checked {get;set;}
}
您的应用程序公开包含一个或多个这些实例的属性
public partial class MainWindow : Window
{
//INotifyPropertyChanged/DependencyObject stuff left out!
public object FooOrBar {get;set;}
//snip
}
在您的XAML中,您有一个扩展ItemsControl或ContentControl或类似的UIElement类型,可以绑定到该属性。
<Window
x:Name="root"
xmlns:t="clr-namespace:MyApplicationWhereFooAndBarLive"
SkipAllThatXmlnsDefinitionNonsenseForSpaceSavingsInThisExample="true"/>
<!-- see Resources below -->
<ConentControl Content="{Binding FooOrBar, ElementName=root}" />
</Window>
最后,您在应用程序的资源中为每个类型定义DataTemplates
<Window.Resources>
<DataTemplate DataType="{x:Type t:Foo}">
<TextBox Text="{Binding Text}" />
</DataTemplate >
<DataTemplate DataType="{x:Type t:Bar}">
<CheckBox Checked="{Binding Checked}" />
</DataTemplate >
</Window.Resources>
DataTemplate选择的过程如下:
FooOrBar = new Foo();
LoadContent()
方法加载可视树。Foo
的新实例)除了添加中间件之外,ItemsControl大致相同(即,ListBox使用ListBoxItem作为中介,LBI是ContentControl)。