Я могу вставить узлы в TreeView во время AfterLabelEdit, не начиная редактировать их?

Попробуйте определить пользовательский ControlTemplate для ListViewItem и добавить свой триггер к <ControlTemplate.Triggers>:

<Style TargetType="{x:Type ListViewItem}">
    <Style.Resources>
        <SolidColorBrush x:Key="Item.MouseOver.Background" Color="#1F26A0DA"/>
        <SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3DDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/>
    </Style.Resources>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.MouseOver.Background}"/>
                        <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.MouseOver.Border}"/>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive" Value="False"/>
                            <Condition Property="IsSelected" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
                        <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
                    </MultiTrigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Selector.IsSelectionActive" Value="True"/>
                            <Condition Property="IsSelected" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
                        <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
                    </MultiTrigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                    <DataTrigger Binding="{Binding Path= ErrorRedFlagByBoard}" Value="1">
                        <Setter Property="Background" TargetName="Bd" Value="Red"></Setter>
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Триггеры в шаблоне по умолчанию имеют приоритет над вашими триггерами. [115 ]

5
задан Andrew Watt 20 March 2009 в 21:30
поделиться

3 ответа

При использовании привязки данных не были должны, обновление источника данных (SomeBoundValue) инициировало обновление узлов? Возможно, можно вынудить менеджера по валюте повторно заполнить структурный вид.... Если Вы волнуетесь по поводу производительности, Вы могли бы использовать один из алгоритмов сортировки, который работает хорошо с данными, которые это почти уже отсортировало (например, НЕ quicksort - слияние или пирамидальная сортировка приходят на ум),

Или Вы могли обойтись без привязки данных полностью и вручную обработать менять местоположение, так как Вы уже - половина пути там с RepositionChangedDataNode ()....

0
ответ дан 15 December 2019 в 01:11
поделиться

попробуйте создать глобальную переменную, скажем:

private bool _allowEdit;

инициализируйте ее значением true ,

в методе OnAfterLabelEdit установите для нее значение false после внесения изменений:

... int oldIndex = node.Index;
    int newIndex = RepositionChangedDataNode(dataNode);

    TreeNode parent = node.Parent;
    parent.Nodes.RemoveAt(oldIndex);
    parent.Nodes.Insert(newIndex, node);
    **_allowEdit = false;**
}
else ...

затем зафиксируйте событие OnBeforeLabelEdit следующим образом:

    protected override void OnBeforeLabelEdit(NodeLabelEditEventArgs e)
    {
        base.OnBeforeLabelEdit(e);
        e.CancelEdit = !_allowEdit;
        _allowEdit = true;
    }

Я заметил, что сразу после запуска AfterLabelEdit обновляется «BeforeLabelEdit». Вот почему вы должны немедленно это остановить.

1
ответ дан 15 December 2019 в 01:11
поделиться

Вы можете попытаться отцепить обработчик OnEdit перед добавлением нового узла и повторно -зацепил после. Я видел такое поведение раньше, и вот как я с этим справлялся.

0
ответ дан 15 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: