2016-09-19 97 views
0

我正在和WPF第一次合作,所以请耐心等待。如何将参数传递给ComboBox ItemsSource绑定?

我有一个组合框,这是为了一般显示一些查找数据。不同类型查找的模型完全相同,只是通过单个方法调用检索的不同数据源通过不同的枚举来控制返回的数据集。相当简单的东西。

public sealed class MyDataProvider 
{ 
    public enum Types 
    { 
     Green, 
     Blue, 
     Orange 
    } 

    private readonly ConcurrentDictionary<string, ObservableCollection<LookUpVm>> _lookupData = 
     new ConcurrentDictionary<string, ObservableCollection<LookUpVm>>(); 

    private static readonly Lazy<MyDataProvider> lazy = 
     new Lazy<MyDataProvider>(() => new MyDataProvider()); 

    public static MyDataProvider Instance => lazy.Value; 

    private MyDataProvider() 
    { 
    } 

    public ObservableCollection<LookUpVm> GreenLookupDataSource => GetLookupDataSource(Types.Green); 

    public ObservableCollection<LookUpVm> GetLookupDataSource(Types lookupEnum) 
    { 
     ObservableCollection<LookUpVm> lookupDataSource; 
     if (_lookupData.TryGetValue(lookupEnum, out lookupDataSource)) 
     return lookupDataSource; 

     lookupDataSource = new ObservableCollection<LookUpVm>(); 
     var returnedlookupDataSource = 
     SomeMasterSource.GetlookupDataSourceBylookupEnum(lookupEnum).OrderBy(ia => ia.Name); 

     foreach (var returnedLookupData in returnedlookupDataSource) 
     { 
     lookupDataSource.Add(returnedLookupData); 
     } 
     _lookupData.TryAdd(lookupEnum, lookupDataSource); 

     return lookupDataSource; 
    } 
} 

这对于第0次迭代很有用,我创建了一个GreenLookupComboBox。

<ComboBox ItemsSource="{Binding Source={x:Static objectDataProviders:MyDataProvider.Instance}, 
      Path=GreenLookupDataSource}" /> 

不过,我真正需要的是能够做的是建立一个下拉框,可以有它的类型枚举值父视图设置,那么这将直接打电话到GetLookupDataSource并通过枚举。我们有几十种查找类型,并且为每种类型定义一个新属性都不太理想。类似下面的控制视图...

<ComboBox ItemsSource="{Binding Source={x:Static objectDataProviders:MyDataProvider.Instance}, 
      Path=GetLookupDataSource}" /> 

而下面的东西,我使用查找控件。

<local:MyLookupControl Type=Types.Green /> 

这是可能的吗?

编辑:

下面是我试图完成的一个例子。

我有两个键值对列表。

那么listOne

1 - 甲

2 - B

3 - Visual C

ListTwo

1 - X

2 - Ÿ

3 - z

他们是通过调用方法的GetList(Enum.LookupType)访问。他们共享相同的ViewModel和View。但是,我需要将它们放在一个表单上供我的用户从中进行选择。

我正在寻找一些方法来使用XAML,就像它们出现在视图上一样。

<local:MyLookupControl Method=GetList Parameter=Enum.ListOne/> 
<local:MyLookupControl Method=GetList Parameter=Enum.ListTwo /> 

这应显示一对组合框,一个绑定到ListOne,一个绑定到ListTwo。

+0

最简单的方法是给viewmodel一个Types属性,它返回Enum.GetValues(typeof(Types)),Type SelectedType属性和一个返回'GetLookupDataSource(SelectedType)'的SelectedTypeValues属性。你可以将这三个属性分解成一个子视图模型'EnumCollectionThingy ' –

回答

0

你基本上只是试图在一对控件上设置数据绑定。这很简单,只要你有正确的视图的datacontext。

控件可以绑定到属性(这正是你正在寻找的)。

使用您编辑的例子这里是你将如何做到这一点:

private ObservableCollection<string> _listOne; 
private ObservableCollection<string> _listTwo; 
private string _selectedListOneItem; 
private string _selectedListTwoItem; 

public ObservableCollection<string> ListOne 
{ 
    get { return _listOne; } 
    set { _listOne = value; } 
} 

public ObservableCollection<string> ListTwo 
{ 
    get { return _listTwo; } 
    set { _listTwo = value; } 
} 

public string SelectedListOneItem 
{ 
    get { return _selectedListOneItem; } 
    set { _selectedListOneItem = value; } 
} 

public string SelectedListTwoItem 
{ 
    get { return _selectedListTwoItem; } 
    set { _selectedListTwoItem = value; } 
} 

XAML:

<ComboBox ItemsSource="{Binding ListOne}" SelectedItem="{Binding SelectedListOneItem}"/> 
<ComboBox ItemsSource="{Binding ListTwo}" SelectedItem="{Binding SelectedListTwoItem}"/> 

你必须在你想如何加载或让您列出了几种选择。你可以将它们加载到构造函数中,或者每当你“进入”属性时加载它们。我会建议在构造函数中加载它们。

我提供的是基本的自动属性,甚至可以进一步简化,但我想告诉你,你也可以在getter和这些属性的制定者编写代码上的项目进一步扩大。例如,当SelectedListOneItem更改时,您可能希望背景上的某些内容启动。在这种情况下,在SelectedListOneItem的SET中,您可以设置该值,但也可以运行可能会更新其他属性的方法/函数。

WPF非常依赖于ViewModels和Views之间绑定的属性。在编辑前的回复中,您使用的字段不能绑定到视图中的控件。

编辑: 如果您计划更新ViewModel中的属性,这些属性将改变视图上的内容,您也将要查看INotifyPropertyChanged。通过实现INotifyPropertyChanged,视图将在属性更改时更新/通知。 INotifyPropertyChanged附带它自己的事件,您必须在设置属性时调用它。这也是一个非常有用的方法,你可以打电话给你,这会让你更轻松地解决这个事件。

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
} 

你叫这像这样:

public string SelectedListOneItem 
{ 
    get { return _selectedListOneItem; } 
    set 
    { 
     _selectedListOneItem = value; 
     OnPropertyChanged(); 
    } 
} 

如果什么都在视图模型更新SelectedListOneItem您的视图会做出相应的变化的方式。在这种情况下,它会使组合框选择您在SelectedListOneItem中设置的新值。