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



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

请注意,视图模型包含一个属性SelectedCriteriaList,该属性绑定到组合框的当前选择项。当此值更改时(例如,通过组合框中的用户选择),视图模型将完成其工作并调用 UpdateOperators() 方法。此方法将更新OperatorList集合,使其项符合所选条件。

然后,您的视图应使用以下绑定:

<ComboBox 
    DisplayMemberPath="SetCriteria" 
    ItemsSource="{Binding CriteriaList}" 
    SelectedItem="{Binding SelectedCriteriaList, Mode=TwoWay}"/>
<ComboBox 
    DisplayMemberPath="OperatorName" 
    ItemsSource="{Binding OperatorList}"/>

最新更新