[英]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.