gpt4 book ai didi

c# - 在 DataTemplate.Triggers 中设置 DataTemplate.VisualTree

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:28 27 4
gpt4 key购买 nike

大家好,我正在尝试更改 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>

但是一个错误告诉我 属性 VisualTree 不能设置为模板上的属性元素。只允许触发器和 Storyboard 作为属性元素有没有人知道根据另一个控件更改 DataGridCell 中的模板的不同方法?

最佳答案

您不要在模板中更改模板,这不是它的工作方式。

有很多方法可以做到这一点。取决于您的应用程序是如何配置的。最常见的方法是

  1. ContentControl 或 ItemsControl 绑定(bind)到属性/集合
  2. 该集合包含一个或多个不同类型的实例
  3. 您在应用程序的资源中定义 DataTemplates,它具有与您的实例类型相匹配的 DataType

例如,您的应用程序中有几个模型

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 的 UIElement 类型或 ContentControl或可以绑定(bind)到该属性的类似内容。

<Window 
x:Name="root"
xmlns:t="clr-namespace:MyApplicationWhereFooAndBarLive"
SkipAllThatXmlnsDefinitionNonsenseForSpaceSavingsInThisExample="true"/>
<!-- see Resources below -->
<ConentControl Content="{Binding FooOrBar, ElementName=root}" />
</Window>

最后,您在应用程序的资源中为每个类型定义数据模板

<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选择的过程是这样的:

  1. 某人在某处设置(我们将在本例中说)FooOrBar = new Foo();
  2. ContentControl 的内容绑定(bind)更新(通过 INPC 或 DependencyProperty)
  3. ContentControl 寻找它的 DataTemplateSelector , 发现没有配置并使用默认实现。
  4. 默认的 DataTemplateSelector 获取绑定(bind)到 Content 属性的对象的类型。
  5. DataTemplateSelector(本质上)查找 logical tree对于作为 DataTemplate 且具有与第 4 步中确定的实例类型匹配的类型的键的资源。
  6. 找到 DataTemplate,并将其传递给 ConentControl
  7. ContentControl 通过 LoadContent() 加载可视化树方法。
  8. ContentControl 将此可视树根的 DataContext 设置为 Content 属性中的值(在我们的例子中,是 Foo 的新实例)
  9. 此可视化树 (IIRC) 添加为 ConentControl 的子级,现在在 UI 中可见。

ItemsControl 大致相同,只是添加了一个中介(即,ListBox 使用 ListBoxItem 作为中介,而 LBI 是一个 ContentControl)。

关于c# - 在 DataTemplate.Triggers 中设置 DataTemplate.VisualTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11511285/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com