问题描述
我编写了一个显示绘图列表的应用程序,作为测试,我编写了一个小应用程序来显示我设想的工作方式。
该应用程序的工作原理:
-
创建一个 BrowserItem 类,它具有名称属性、活动属性和三个级别的分组。
-
有一个WPF ListView绑定一个ObservableCollection,并使用ICollectionView来显示基于三层分组嵌套的列表视图中的BrowserItems
-
当应用程序运行时,它会创建多个 BrowserItems,设置它们的名称和分组等,并在 ListView 中显示这些项目
这一切都很好。
作为测试,该应用程序有一个滑块,它根据滑块编号简单地将 BrowserItem 的 Active 属性设置为 true - 这会导致它在列表视图中以绿色突出显示,因为 Active 是字体背景的绑定属性.
我希望发生的是当它以绿色突出显示时,例程将自动展开所有扩展器,以便用户无需寻找即可看到突出显示的项目。
有什么办法可以获得浏览器项目的父扩展器吗?
代码可以在这里下载: https://drive.google.com/file/d/1MW-v2gqFtubhnZdKUYGglQLN3S5xnVB4/view?usp=sharing
浏览器项目类:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ListBoxTest3
{
public partial class BrowserItem : ViewModelBase
{
/// <summary>
/// BrowserItem represents a node on the browser treeview structure and relates to either a browser branch or a view / sheet
/// </summary>
//Group one nesting level
private string _l1group;
public string L1group
{
get
{
return _l1group;
}
set
{
_l1group = value;
OnPropertyChanged(nameof(L1group));
}
}
//Group two nesting level
private string _l2group;
public string L2group
{
get
{
return _l2group;
}
set
{
_l2group = value;
OnPropertyChanged(nameof(L2group));
}
}
//Group three nesting level
private string _l3group;
public string L3group
{
get
{
return _l3group;
}
set
{
_l3group = value;
OnPropertyChanged(nameof(L3group));
}
}
//Name
private string _name;
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
}
//Active or _active = is bound to the active view highlight
private bool _active;
public bool Active
{
get => _active;
set
{
if (value != _active)
{
_active = value;
OnPropertyChanged(nameof(Active));
}
}
}
}
}
MainWindow.Xaml:
<Window x:Class="ListBoxTest3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ListBoxTest3"
mc:Ignorable="d"
Title="MainWindow"
Height="450"
Width="400">
<Grid>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal"
Margin="10">
<TextBlock Text="Filter: " />
<TextBox x:Name="FilterBoxText"
Width="330"
Text="{Binding BrowserItemFilter,UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal"
Margin="10">
<TextBlock Text="Change Active to number: " />
<Slider x:Name="changeactive"
Width="210"
SmallChange="1"
ValueChanged="Slider_ValueChanged"
IsSnapToTickEnabled="True"
TickFrequency="1"
TickPlacement="Both">
</Slider>
<TextBlock x:Name="displayslider"
Text="0" />
</StackPanel>
</StackPanel>
</StackPanel>
<ListView Name="TreeViewSheets"
Margin="10,10,10"
Height="314"
ItemsSource="{Binding BrowserItemCollectionView}">
<ListView.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text="{Binding Name}">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding Active}"
Value="true">
<Setter Property="Background"
Value="YellowGreen" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander>
<Expander.Header>
<TextBlock Text="{Binding Name}"
FontWeight="Bold"
VerticalAlignment="Bottom" />
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
</StackPanel>
</Grid>
</Window>
MainWindow.xaml 背后的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
namespace ListBoxTest3
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
MainWindowViewModel store
{
get;
set;
}
public MainWindow()
{
InitializeComponent();
store = new MainWindowViewModel();
store.Browser.Add(new BrowserItem() { Name = "Level 01 Plan",L1group = "Architectural",Active = true,L2group = "Floor Plans",L3group = "1:100" }); ;
store.Browser.Add(new BrowserItem() { Name = "Level 01 Plan",L1group = "Structural",Active = false,L3group = "1:20" });
store.Browser.Add(new BrowserItem() { Name = "Level 02 Plan",L3group = "1:100" });
store.Browser.Add(new BrowserItem() { Name = "Level 02 Plan",L3group = "1:100" });
store.Browser.Add(new BrowserItem() { Name = "Elevation East",L2group = "Elevations",L3group = "1:100" });
store.Browser.Add(new BrowserItem() { Name = "Elevation West",L3group = "1:20" });
store.Browser.Add(new BrowserItem() { Name = "Elevation North",L3group = "1:100" });
store.Browser.Add(new BrowserItem() { Name = "Section A-A",L2group = "Sections",L3group = "1:100" });
store.Browser.Add(new BrowserItem() { Name = "Section B-B",L3group = "1:100" });
store.Browser.Add(new BrowserItem() { Name = "Section C-C",L3group = "1:100" });
store.Browser.Add(new BrowserItem() { Name = "Main Section",L2group = "Main Sections",L3group = "1:100" });
store.Browser.Add(new BrowserItem() { Name = "Level 01 RCP",L2group = "Ceiling Plans",L3group = "1:100" });
TreeViewSheets.DataContext = store;
FilterBoxText.DataContext = store;
//Set slider max value
changeactive.Maximum = store.Browser.Count() - 1;
}
private void Slider_ValueChanged(object sender,RoutedPropertyChangedEventArgs<double> e)
{
//When slider is moved,set the item in the list as active
for (int f=0; f < store.Browser.Count; f++)
{
if (f == changeactive.Value)
{
store.Browser[f].Active = true;
displayslider.Text = f.ToString();
TreeViewSheets.ScrollIntoView(store.Browser[f]);
}
else
{
store.Browser[f].Active = false;
}
}
}
}
}
MainWindowViewModel 类,它包含包含浏览器项目的 ObservableCollection。它还具有 MainWindowViewModel 的构造函数,该构造函数使用 CollectionViewSource 进行分组 - 这会根据 BrowserItem 类的 L1Group、L2Group 和 L3Group 字段为 Listview 动态创建组扩展器:
class MainWindowViewModel : ViewModelBase
{
public ICollectionView BrowserItemCollectionView { get; }
private ObservableCollection<BrowserItem> _browser = new ObservableCollection<BrowserItem>();
public ObservableCollection<BrowserItem> Browser
{
get => _browser;
set
{
if (value != _browser)
{
_browser = value;
OnPropertyChanged(nameof(Browser));
}
}
}
private string _browserItemFilter = string.Empty;
public string BrowserItemFilter
{
get
{
return _browserItemFilter;
}
set
{
_browserItemFilter = value;
OnPropertyChanged(nameof(BrowserItemFilter));
BrowserItemCollectionView.Refresh();
}
}
public MainWindowViewModel()
//Constructor
{
BrowserItemCollectionView = CollectionViewSource.GetDefaultView(_browser);
//Set up filter
BrowserItemCollectionView.Filter = FilterBrowserItems;
//Set up grouping
BrowserItemCollectionView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(BrowserItem.L1group)));
BrowserItemCollectionView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(BrowserItem.L2group)));
BrowserItemCollectionView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(BrowserItem.L3group)));
}
private bool FilterBrowserItems(object obj)
{
if (obj is BrowserItem check)
{
return check.Name.Contains(BrowserItemFilter);
}
return false;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)