C# WPF扩展器-任何时候只需扩展一个扩展器

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

在WPF列表视图中,我创建了几个WPF扩展器,在每个扩展器中我有几个项目。现在我只想每次只扩展一个扩展器…这意味着如果一个扩展器被扩展,所有其他扩展器将被合并。你能帮忙吗?请注意,扩展器是由ItemTemplate创建的

XMAL:

<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);}
}
}