2016-09-19 99 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中設置的新值。