Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MvvM模型中显示由属性更改事件驱动的组合框列表_C#_Xaml_Mvvm_Combobox - Fatal编程技术网

C# 在MvvM模型中显示由属性更改事件驱动的组合框列表

C# 在MvvM模型中显示由属性更改事件驱动的组合框列表,c#,xaml,mvvm,combobox,C#,Xaml,Mvvm,Combobox,我是MVVM的新手,我正在我的模型中编写一个包含2个组合框的搜索视图。我需要根据我的第一个组合框选择在我的第二个组合框中显示各种列表。组合框1看起来像这样 <ComboBox Margin="103,6,0,24" Name="cmbCriteria" DisplayMemberPath="SetCriteria" Grid.Column="1"> <ComboBox.ItemsSource>

我是MVVM的新手,我正在我的模型中编写一个包含2个组合框的搜索视图。我需要根据我的第一个组合框选择在我的第二个组合框中显示各种列表。组合框1看起来像这样

<ComboBox Margin="103,6,0,24" Name="cmbCriteria" DisplayMemberPath="SetCriteria" Grid.Column="1">
                        <ComboBox.ItemsSource>
                            <CompositeCollection>
                                <CollectionContainer Collection="{Binding Source={x:Static model:SearchCriteriaStaicData.MyStaicCriteriaList}}" />
                            </CompositeCollection>
                        </ComboBox.ItemsSource>
                    </ComboBox>
这将显示代码隐藏中的数据

{
        public string SetCriteria { get; set; }

    }    
    public class SearchCriteriaStaicData
    {
        public static List<SearchCriteriaList> MyStaicCriteriaList
        {
            get
            {
                return new List<SearchCriteriaList>()
                {
                    new SearchCriteriaList {SetCriteria = "Date Range"},
                    new SearchCriteriaList {SetCriteria = "Gateway"},
                };
            }
        }
    }
我想做的是,如果选择的组合框值是日期范围,那么 我的第二个组合框显示我的SearchDateOperatorStaticData类中的列表

public class SearchDateOperatorStaticData
   {
       public static List<SearchOperatorLists> DateStaicOperatorList
       {
           get 
           {
               return new List<SearchOperatorLists>()
               {
                   new SearchOperatorLists {OperatorName = "Today"},
                   new SearchOperatorLists {OperatorName = "Between"},
                   new SearchOperatorLists {OperatorName = "Last Month"},
               };
           }
       }     
   }
或者,如果从第一个组合框中选择了网关,则第二个组合框将显示SearchGatewayOperatorStaticData中的列表

public class SearchGatewayOperatorStaticData
   {
       public static List<SearchOperatorLists> GatewayStaicOperatorList
       {
           get
           {
               return new List<SearchOperatorLists>()
               {
                   new SearchOperatorLists {OperatorName = "Email"},
                   new SearchOperatorLists {OperatorName = "RDP"},
                   new SearchOperatorLists {OperatorName = "Web"},
                   new SearchOperatorLists {OperatorName = "Other"},
               };
           }
       }  
   }
因为您添加了mvvm标记,所以我建议您遵循mvvm模式并将逻辑移到视图模型

创建包含集合的视图模型:

class ViewModel : INotifyPropertyChanged
{
    private readonly List<SearchOperatorLists> dateOperatorList = new List<SearchOperatorLists> 
    {
        new SearchOperatorLists {OperatorName = "Today"},
        new SearchOperatorLists {OperatorName = "Between"},
        new SearchOperatorLists {OperatorName = "Last Month"} 
    };

    private readonly List<SearchOperatorLists> gatewayOperatorList = new List<SearchOperatorLists> 
    {
        new SearchOperatorLists {OperatorName = "Email"},
        new SearchOperatorLists {OperatorName = "RDP"},
        new SearchOperatorLists {OperatorName = "Web"},
        new SearchOperatorLists {OperatorName = "Other"} 
    };

    private SearchCriteriaList selectedCriteriaList;

    public ViewModel()
    {
        this.CriteriaList = new ObservableCollection<SearchCriteriaList> 
        {
            new SearchCriteriaList {SetCriteria = "Date Range"},
            new SearchCriteriaList {SetCriteria = "Gateway"} 
        };

        this.OperatorList = new ObservableCollection<SearchOperatorLists>();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<SearchCriteriaList> CriteriaList { get; private set; }

    public SearchCriteriaList SelectedCriteriaList 
    {
        get { return this.selectedCriteriaList; }
        set
        {
            if (value != this.selectedCriteriaList)
            {
                this.selectedCriteriaList = value;
                this.OnPropertyChanged("SelectedCriteriaList");
                this.UpdateOperators();
            }
        }
    }

    public ObservableCollection<SearchOperatorLists> OperatorList { get; private set; }

    private void UpdateOperators()
    {
        this.OperatorList.Clear();

        if (this.SelectedCriteriaList == this.CriteriaList[0])
        {
            foreach (SearchOperatorLists item in this.dateOperatorList)
            {
                this.OperatorList.Add(item);
            }
        }
        else if (this.SelectedCriteriaList == this.CriteriaList[1])
        {
            foreach (SearchOperatorLists item in this.gatewayOperatorList)
            {
                this.OperatorList.Add(item);
            }
        }
    }

    private void OnPropertyChanged(string property)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
<ComboBox 
    DisplayMemberPath="SetCriteria" 
    ItemsSource="{Binding CriteriaList}" 
    SelectedItem="{Binding SelectedCriteriaList, Mode=TwoWay}"/>

<ComboBox 
    DisplayMemberPath="OperatorName" 
    ItemsSource="{Binding OperatorList}"/>