2012-05-30 5 views
1

все,WPF Combo Box и привязки данных к другим классам

Я действительно застрял на очень простой концепции - я просто не могу найти ответ, который я действительно понимаю.

У меня есть вид - видКонтакты. Его datacontext - это viewmodel - viewmodelContacts.

У меня есть сводка для «названий» (вы знаете ... Mr, Mrs, Miss и т. Д.). Я хочу связать источник items, чтобы он показывал список параметров и привязывал SelectedValue, чтобы он сохранял ключ в свойстве viewmodelContacts TitleId.

«Исходный» список, если титры (которые я хочу связать с ItemsSource) на самом деле находятся в отдельном статическом классе - обратите внимание на не viewmodel!

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.

Как установить ItemSource для этого статического класса? Как еще больше установить DisplayMemberPath в свойство Description базового объекта Title?

Что я должен установить для SelectedValue и SelectedValuePath?

Действительно, кто-то может помочь мне с тем, что кажется простой проблемой, которую я просто не могу решить.

Спасибо, Серый

+1

У вас нет времени для полномасштабного ответа, но почему бы просто не создать свойство в вашей модели ViewModel, которое возвращает данные из вашей «Модели»? В этом случае ваша модель является статическим классом - позже это будет то, что вы используете для получения данных из базы данных. Таким образом, привязка к виду не изменится при изменении вашей модели (которая является одной из основных точек MVVM - разделение проблем). –

ответ

2

В вашей ViewModel создать свойство, как так:

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

Привет, le o 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

, если ваша модель просмотра предоставит список, это будет больше mvvm и проще :) – blindmeis

Смежные вопросы