C# WPF扩展器-任何时候只需扩展一个扩展器
在WPF列表视图中,我创建了几个WPF扩展器,在每个扩展器中我有几个项目。现在我只想每次只扩展一个扩展器…这意味着如果一个扩展器被扩展,所有其他扩展器将被合并。你能帮忙吗?请注意,扩展器是由ItemTemplate创建的 XMAL:C# WPF扩展器-任何时候只需扩展一个扩展器,c#,wpf,mvvm,expander,C#,Wpf,Mvvm,Expander,在WPF列表视图中,我创建了几个WPF扩展器,在每个扩展器中我有几个项目。现在我只想每次只扩展一个扩展器…这意味着如果一个扩展器被扩展,所有其他扩展器将被合并。你能帮忙吗?请注意,扩展器是由ItemTemplate创建的 XMAL: <UserControl x:Class="DataRetrieval.Views.ParametersView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/present
<UserControl x:Class="DataRetrieval.Views.ParametersView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
xmlns:local="clr-namespace:DataRetrieval.Views"
d:DesignWidth="400" Height=" 600" Background="White">
<UserControl.Resources>
<DataTemplate x:Key="StringDataTemplate">
<StackPanel Margin="5" >
<TextBlock Text="{Binding Name}" />
<TextBox Text="{Binding SelectedValue, UpdateSourceTrigger=PropertyChanged}" Width="290" />
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="DateDataTemplate">
<StackPanel Margin="5" >
<ComboBox SelectedIndex="{Binding SelectedValue, UpdateSourceTrigger=PropertyChanged}" Text="{Binding Name}" Width="290" ItemsSource="{Binding UserItems}"/>
<DatePicker SelectedDate="{Binding multitype.datetime}" Width="200"/>
</StackPanel>
</DataTemplate>
<local:ParamControlTemplateSelector x:Key="myParamTemplateSelector" />
</UserControl.Resources>
<Border BorderBrush="LightGray" BorderThickness="1,1,1,1" CornerRadius="8,8,8,8" Margin="20" Background="#FFF3F3F3">
<Grid Margin="5">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ListView x:Name="myListView1" ItemsSource="{Binding Qtables, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding SelectedIndex}">
<ListView.ItemTemplate>
<DataTemplate>
<Expander Header="{Binding Name}" Width="320" IsExpanded="{Binding IsExpanded}" >
<StackPanel Height="600">
<TextBlock Text="{Binding Name}" />
<ListView x:Name="myListView" ItemsSource="{Binding Params, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemTemplateSelector="{StaticResource myParamTemplateSelector}" SelectedIndex="{Binding CurrentUser, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</ListView>
</StackPanel>
</Expander>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ScrollViewer>
</Grid>
</Border>
</UserControl>
视图模型
namespace DataRetrieval.ViewModel
{
class ParametersViewModel:BindableBase
{
public ParametersViewModel()
{
AParams = new WhereParams();
Qtables = new QDatatables();
for (int j = 0; j < 5;j++ )
{
for (int i = 0; i < 10; ++i)
{
int[] numbers;
numbers = new int[3] { 1, 2, 3 };
var parameter = new WhereParam { ID = i, Name = "Name " + i.ToString() };
if (i == 2 || i == 4)
{
parameter.Type = ParamTypeEnum.datetimeType;
}
AParams.Add(parameter);
}
var qtable = new QDatatable { ID=j, Name = j.ToString() + "QTable", Params = AParams};
Qtables.Add(qtable);
}
}
private WhereParam _parameter;
public WhereParam Parameter
{
get { return _parameter; }
set
{
SetProperty(ref _parameter, value);
}
}
private WhereParams _paramas;
public WhereParams AParams
{
get { return _paramas; }
set { SetProperty(ref _paramas, value); }
}
private QDatatables _qtables;
public QDatatables Qtables
{
get { return _qtables; }
set
{
SetProperty(ref _qtables, value);
}
}
}
}
namespace DataRetrieval.ViewModel
{
类参数viewmodel:BindableBase
{
公共参数viewmodel()
{
AParams=新的WhereParams();
Qtables=新的QDatatables();
对于(int j=0;j<5;j++)
{
对于(int i=0;i<10;++i)
{
int[]数字;
数字=新整数[3]{1,2,3};
var parameter=newwhereparam{ID=i,Name=“Name”+i.ToString()};
如果(i==2 | | i==4)
{
parameter.Type=ParamTypeEnum.datetimeType;
}
AParams.Add(参数);
}
var qtable=newqdatatable{ID=j,Name=j.ToString()+“qtable”,Params=AParams};
Qtables.Add(qtable);
}
}
私有WhereParam_参数;
公共WhereParam参数
{
获取{return\u参数;}
设置
{
SetProperty(参考参数、值);
}
}
private WhereParams_paramas;
公共公寓
{
获取{return\u paramas;}
set{SetProperty(ref _paramas,value);}
}
私有QDatatables _qtables;
公共QDatatables Qtables
{
获取{return\u qtables;}
设置
{
SetProperty(ref\u qtables,value);
}
}
}
}
这可以通过更改模型来处理iExpanded
QTables的模型:
public class QDatatables : BindableBase
{
public QDatatables()
{
List.CollectionChanged += List_CollectionChanged;
}
void List_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
foreach (var item in e.NewItems)
{
var test = item as QDatatable;
test.PropertyChanged += test_PropertyChanged;
}
}
void test_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "IsExpanded")
{
var cur = sender as QDatatable;
if (cur.IsExpanded == true)
{
foreach (var item in List)
{
if (item.Name != cur.Name && item.IsExpanded == true)
{
item.IsExpanded = false;
}
}
}
}
}
private ObservableCollection<QDatatable> _list;
public ObservableCollection<QDatatable> List
{
get { return _list ?? (_list=new ObservableCollection<QDatatable>()); }
set { SetProperty(ref _list, value); }
}
}
公共类QDatatables:BindableBase
{
公共QDatatables()
{
List.CollectionChanged+=列表_CollectionChanged;
}
无效列表\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
foreach(e.NewItems中的var项)
{
var测试=作为QDataStable的项目;
test.PropertyChanged+=test\u PropertyChanged;
}
}
无效测试\u PropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
如果(例如,PropertyName==“IsExpanded”)
{
var cur=发送方作为QDataStable;
if(cur.IsExpanded==true)
{
foreach(列表中的变量项)
{
if(item.Name!=cur.Name&&item.IsExpanded==true)
{
item.IsExpanded=false;
}
}
}
}
}
私有可观察收集列表;
公共可观测收集列表
{
获取{return _list???(_list=newobserveCollection());}
set{SetProperty(ref_list,value);}
}
}