簡體   English   中英

在WPF樹視圖(MVVM)中取消選擇所選項目

[英]Deselect selected item in wpf tree view (MVVM)

當我選擇一個節點\\項目時,我正在使用WPF樹視圖。 當用戶第二次單擊所選節點時,我希望取消選擇該節點\\項目,即我應該能夠獲取該事件。 如果我單擊已選擇的選定節點\\項目,則不會調用IsSelected。 我該如何工作?

<TreeView Grid.Column="0" Grid.Row="1" ItemsSource="{Binding source}" Name="mytreeview">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="FontWeight" Value="Normal" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding displaytext}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

在我看來,我有

 public bool IsSelected
    {
        get 
        { 
            return _isSelected; 
        }
        set
        {
            if (value != _isSelected)
            {
                _isSelected = value;
                if (_isSelected)
                {
                  //my logic
                }

                this.OnPropertyChanged("IsSelected");
            }
        }
    }
if (value != _isSelected)

假設UI甚至試圖設置某些內容,那么該行會阻塞您的切換邏輯。 這樣的事情至少應該修復該部分。

    set
    {
        if (value != _isSelected)
        {
            _isSelected = value;
            this.OnPropertyChanged("IsSelected");
        }
        else if(_isSelected)
        {
            IsSelected = false;
        }
    }

否則,UI會在設置值之前檢查選擇,您將需要通過其他一些用戶交互來處理它,例如處理單擊時的取消選擇。

我知道這有點晚了,但是我最近有相同的要求(即在第二次單擊時取消選擇一個選定的TreeViewItem),並且通過在“樣式”項中為“ MouseLeftButtonUp”事件聲明了一個事件處理程序來解決了該問題TreeView的ItemContainerStyle如下:

<TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
        <EventSetter Event="MouseLeftButtonUp" Handler="TreeViewItem_MouseLeftButtonUp"/>
    </Style>
</TreeView.ItemContainerStyle>

后面代碼中的事件處理程序如下:

private TreeViewItem prevTVI;

private void TreeViewItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    TreeViewItem tvi = (TreeViewItem)sender;
    if (tvi == this.prevTVI)
    {
        this.prevTVI = null;
        if (tvi.IsSelected)
            tvi.IsSelected = false;
    }
    else
        this.prevTVI = tvi;
    e.Handled = true;
}

現在,我想問問是否有人認為這種方法破壞了MVVM模式? 我個人不認為事件處理程序僅與View及其對象相關,因此我想聽聽其他人必須說的話,尤其是在有人有其他選擇的情況下。

僅當您選擇一個新項目時,IsSelected屬性才會更改。 在同一項目上單擊兩次通常將無效。 您將需要在TreeView上注冊MouseDown事件,然后強制在后面的代碼中取消選擇該項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM