1

ノード\アイテムが選択されたらクリックすると、WPFツリービューを使用しています。ユーザーが選択したノードを 2 回目にクリックすると、このノード\アイテムの選択が解除されます。つまり、イベントを取得できるはずです。既に選択されている選択されたノード\アイテムをクリックしても、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");
            }
        }
    }
4

3 に答える 3

0

これは少し遅れていることはわかっていますが、最近同じ要件 (つまり、2 回目のクリックで選択した 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パターンを壊していると思う人がいるかどうか尋ねたいと思いますか? イベントハンドラーはビューとそのオブジェクトにのみ関係しているため、個人的にはそうは思いませんが、特に誰かが代替手段を持っている場合は、他の人の意見を聞きたいです。

于 2016-07-26T14:43:17.840 に答える
-1

IsSelected プロパティは、新しいアイテムを選択したときにのみ変更されます。通常、同じ項目を 2 回クリックしても効果はありません。TreeView で MouseDown イベントを登録し、コード ビハインドで項目の選択を強制的に解除する必要があります。

于 2013-08-08T21:54:33.150 に答える