gpt4 book ai didi

c# - TreeViews 上的附加属性

转载 作者:行者123 更新时间:2023-12-03 10:38:06 26 4
gpt4 key购买 nike

所以我有这个代码:

<Style TargetType="{x:Type TreeViewItem}">
<Style.Resources>
<Converters:GetElementTypeConverter x:Key="GetElementTypeConverter" />
</Style.Resources>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=., Converter={StaticResource GetElementTypeConverter}}" Value="{x:Type Models:ServerItem}">
<Setter Property="CommandBehaviors:MouseDoubleClick.Command" Value="{Binding ConnectServer}" />
<Setter Property="CommandBehaviors:MouseDoubleClick.CommandParameter" Value="{Binding Path=SelectedItem, RelativeSource={RelativeSource Self}}" />
<Setter Property="Foreground" Value="Gray" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=., Converter={StaticResource GetElementTypeConverter}}" Value="{x:Type Models:DatabaseItem}">
<Setter Property="CommandBehaviors:MouseDoubleClick.Command" Value="{Binding ConnectDb}" />
<Setter Property="CommandBehaviors:MouseDoubleClick.CommandParameter" Value="{Binding Path=SelectedItem, RelativeSource={RelativeSource Self}}" />
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>

它为 TreeView 项目定义了一些属性,但它并不完全有效 - 我的意思是它设置前景色,但是当我双击任何项目时,它不会触发我的命令。

最佳答案

我认为这与您之前的问题有关。

  • 有了我昨天提到的这个设置,记住 RelayCommand<T>需要在相关元素而不是父虚拟机上。这就是为什么您可能会看到 Foreground属性工作正常,但命令从 DataContext 开始执行正在查找命令的位置(ServerItemDatabaseItem)实际上并未定义命令 ConnectServerConnectDb .
  • 此外,设置 ConnectDb 而不是两个触发器默认并使用触发器设置ConnectServer只需 ServerItem的有关元素。

  • 现在要解决您的问题,您可以定义 ConnectServer您的 ServerItem 中的命令和 ConnectDb您的 DatabaseItem 中的命令,或者如果您想将命令保留在 TreeView 的 DataContext 中, 使用 RelativeSource绑定(bind)以从 TreeView 中查找这些命令.

    类似的东西(经过测试,效果很好):
    <TreeView ItemsSource="{Binding ServerItems}">
    <TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
    <Style.Resources>
    <CommandBehaviors:GetElementTypeConverter x:Key="GetElementTypeConverter" />
    </Style.Resources>
    <Setter Property="CommandBehaviors:MouseDoubleClick.Command"
    Value="{Binding Path=DataContext.ConnectDb,
    RelativeSource={RelativeSource FindAncestor,
    AncestorType={x:Type TreeView}}}" />
    <Setter Property="CommandBehaviors:MouseDoubleClick.CommandParameter"
    Value="{Binding Path=.}" />
    <Setter Property="Foreground"
    Value="Black" />
    <Style.Triggers>
    <DataTrigger Binding="{Binding Path=.,
    Converter={StaticResource GetElementTypeConverter}}"
    Value="{x:Type CommandBehaviors:ServerItem}">
    <Setter Property="CommandBehaviors:MouseDoubleClick.Command"
    Value="{Binding Path=DataContext.ConnectServer,
    RelativeSource={RelativeSource FindAncestor,
    AncestorType={x:Type TreeView}}}" />
    <Setter Property="Foreground"
    Value="Tomato" />
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding Databases}">
    <TextBlock Text="{Binding}" />
    </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
    </TreeView>

    更新: (修复了 DoubleClick 的递归 TreeViewItem 事件调用)

    在你的类(class) MouseDoubleClick
    转变:
    public class MouseDoubleClick {

    ...

    private static void OnMouseDoubleClick(object sender, RoutedEventArgs e) {
    Control control = sender as Control;
    ICommand command = (ICommand)control.GetValue(CommandProperty);
    object commandParameter = control.GetValue(CommandParameterProperty);
    command.Execute(commandParameter);
    }
    }


    public class MouseDoubleClick {

    ...

    private static void OnMouseDoubleClick(object sender, RoutedEventArgs e) {
    Control control = sender as Control;
    var possibleTreeViewItem = sender as TreeViewItem;
    if (control == null || (possibleTreeViewItem != null && !possibleTreeViewItem.IsSelected))
    return;
    ICommand command = (ICommand)control.GetValue(CommandProperty);
    object commandParameter = control.GetValue(CommandParameterProperty);
    command.Execute(commandParameter);
    }
    }

    关于c# - TreeViews 上的附加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16871028/

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