2012-05-30 33 views
1

所有,WPF組合框和數據綁定到其他類

我真的被困在一個很基本的概念 - 我無法找到答案,我真的明白了。

我有一個視圖 - viewContacts。它的datacontext是一個viewmodel - viewmodelContacts。

在視圖我有「冠軍」(你知道......先生,太太,小姐,等等)的組合框。我想綁定itemssource,以顯示選項列表,並綁定SelectedValue,以便將關鍵字存儲在viewmodelContacts TitleId屬性中。

「來源」列表中,如果標題(即我要綁定到的ItemsSource)實際上是在一個單獨的靜態類 - 注意不是視圖模型!

internal static class Titles 
{ 
    static IList<Title> _colTitles = null; 
    static Titles() 
    { 
     _colTitles = new List<Title>(); 
     _colTitles.Add(new Title() { TitleId = 1, Description = "Mr." }); 
     _colTitles.Add(new Title() { TitleId = 2, Description = "Mrs." }); 
     _colTitles.Add(new Title() { TitleId = 3, Description = "Miss." }); 
     _colTitles.Add(new Title() { TitleId = 4, Description = "Ms." }); 
    } 

    internal static IList<Title> GetTitles() 
    { 
     return _colTitles; 
    } 
} 

(稍後,當然,這些東西將從數據庫中提取)。

這個簡單的任務超過了我作爲WPF開發人員的才能。

我如何設置的ItemsSource這個靜態類?我如何進一步將DisplayMemberPath設置爲底層Title對象的Description屬性?

什麼我的的SelectedValue和SelectedValuePath設置?

真的希望有人能幫助我走出這似乎是一個簡單的問題,我只是不能工作了。

感謝, 灰色

+1

沒有時間做出全面的答案,但爲什麼不直接在ViewModel中創建一個屬性來返回「Model?」中的數據?在這種情況下,您的模型是靜態類 - 稍後,它將是您用來從數據庫獲取數據的任何內容。這樣,當您更改模型時(這是MVVM的關鍵點之一 - 關注點分離),您的視圖綁定不會更改。 –

回答

2

在您的視圖模型創建一個屬性,像這樣:

public IList<Title> VmTitles 
{ 
    get 
    { 
     return Titles.GetTitles(); 
    } 
} 

private Title _selectedTitle; 
public Title SelectedTitle 
{ 
    get 
    { 
     return _selectedTitle; 
    } 
    set 
    { 
     if (value != _selectedTitle) 
     { 
      _selectedTitle = value; 
      OnPropertyChanged("SelectedTitle"); 
     } 
    } 
} 

然後在你的.xaml中你這樣做:

<ComboBox x:Name="cboTitle" ItemsSource="{Binding Path=VmTitles}" DisplayMemberPath="Description" SelectedItem="{Binding Path=SelectedTitle}" /> 
+0

Hi lee O :) ..我可以問題Title SelectedTitle的這個屬性是做什麼的? –

+0

+1。我剛剛添加了_selectedTitle私有成員的聲明,以便學習這些東西的含義。 –

+0

@WonkotheSane謝謝兄弟們:) –

1
<ComboBox x:Name="cboTitle" SelectedValuePath="TitleId" DisplayValuePath="Description" SelectedValue="{Binding PropertyToBeUpdatedHere}"/> 

然後設置組合框的項目源代碼中的..

cboTitle.ItemsSource = Titles.GetTitles(); 
+0

那不是MVVM –

+0

@WonkotheSane你好你能幫我嗎? –

+0

請參閱我對問題的評論 –

0

只需使用一個ObjectDataProvider的。

<UserControl.Resources> 
    <ObjectDataProvider x:Key="cboSource" ObjectType="local:Titles" MethodName="GetTitles"/> 
</UserControl.Resources> 

    <ComboBox ItemsSource="{Binding Source={StaticResource cboSource}}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Description}"/> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

ps:你必須改變你的內部靜態爲公共靜態。

+0

如果你的viewmodel提供的列表,它會更mvvm和更容易:) – blindmeis