2009-11-30 1 views
2

У меня есть эта проблема, у меня есть приложение Silverlight, написанное с использованием MVVM. Мне нужно создать DataForm, который привязан к свойству ViewModel, и я хочу добавить ComboBox и заполнить его значениями из другой коллекции в той же ViewModel.Silverlight привязывает сборку к Combobox в DataForm с использованием MVVM

Код:

<dataFormToolkit:DataForm CurrentItem="{Binding NewUser, Mode=TwoWay}" AutoGenerateFields="False" Height="298"> 
      <dataFormToolkit:DataForm.EditTemplate> 
       <DataTemplate> 
        <StackPanel> 

         <dataFormToolkit:DataField Label="Email"> 
          <TextBox Text="{Binding Email, Mode=TwoWay}"/> 
         </dataFormToolkit:DataField> 

         <dataFormToolkit:DataField Label="Język"> 
          <ComboBox ItemsSource="{Binding Path=Languages, Mode=TwoWay}"/> 
         </dataFormToolkit:DataField> 

        </StackPanel> 
       </DataTemplate> 
      </dataFormToolkit:DataForm.EditTemplate> 
     </dataFormToolkit:DataForm> 

Все это обрабатывается NewAccountVM, который имеет следующие свойства:

private User newUser; 
    public User NewUser { 
     get 
     { 
      return newUser; 
     } 
     set 
     { 
      if (value != newUser) 
      { 
       newUser = value; 
       RaisePropertyChanged("NewUser"); 
      } 
     } 
    } 

    private ObservableCollection<Language> languages; 

    public ObservableCollection<Language> Languages 
    { 
     get { return languages; } 
     set 
     { 
      if (languages != value) 
      { 
       languages = value; 
       RaisePropertyChanged("Languages"); 
      } 
     } 
    } 

Теперь это все работает, кроме добавления ItemsSource в ComboBox. Я нашел много примеров, показывающих, как заполнять CB в CodeBehind, но, как я уже сказал, я хочу сделать это в MVVM-стиле :) Я понимаю, что ComboBox унаследовал DataContext от DataForm, и этот ItemSource = "{Binding Path = Languages, Mode = TwoWay} "не будет работать, но я не знаю, как достичь своей цели.

Может кто-нибудь мне помочь?

ответ

6

1) Объявите viewmodel в виде в разделе ресурсов.

<UserControl.Resources> 
    <local:MyViewModel x:Key="myViewModel" /> 
</UserControl.Resources> 

2) Привязать ComboBox к свойству коллекции на viewmodel.

<ComboBox ItemsSource="{Binding Path=Languages, 
           Source={StaticResource myViewModel}, 
           Mode=TwoWay}"/> 
+0

Спасибо, это он :) Я понял это eriler, но у меня была проблема с моим ViewModel, потому что это было 2, мне пришлось реорганизовать создание моих ViewModels для этого со статическими ресурсами. Еще раз спасибо. – michajas

+0

В этом примере, где вы устанавливаете ViewModel как DataContext для UserControl? Я предполагаю, что вы делаете это в конструкторе UserControl, но я хотел бы знать наверняка. –

+0

@michajas Будьте осторожны при настройке виртуальных машин внутри ресурсов, если ваш VM ctor выдает исключение, он будет проглочен ошибкой синтаксического анализа XAML. Я бы очень хотел рассмотреть возможность установки виртуальной машины в событии Loaded и использования контейнера IoC для большей гибкости. – Agies

0

вы можете установить контекст данных в XAML для вашего статического ресурса следующим образом:

<UserControl.DataContext> 
    <Binding Source="{StaticResource myViewModel}" /> 
</UserControl.DataContext> 
0

Сценарий: 1. Предположим, вы хотите, чтобы заполнить комбо со всеми членскими ролей, и позволяет клиенту выбрать роль и назначить пользователя: т.е. Objecta: Aspnet_Role т.е. ObjectB: Пользователь

  1. Допустим User.MembershipRoleId должен быть связан с Aspnet_Role.RoleId

  2. DataForm обязан ObjectB

  3. выпадающий в DataForm заполняется список
  4. В XAML написать следующее :

    <Combobox DisplayMemberPath="RoleName" SelectedValue="{Binding MembershipRoleId,Mode=TwoWay}" SelectedValuePath="RoleId" />

здесь отображение, ObjectB.MembershipRoleId = ObjectA.RoleId

Сценарий B: 1. Если вы не хотите, чтобы явно определить по пути в ScenarioA, то в этом случае, определим ForeignKey- Связь PrimaryKey между таблицами в базе данных, например ForeignKey -> User.MembershipId PrimaryKey -> Aspnet_Roles.RoleId 2. Из файла ADO.NET (.edmx) обновите модель из базы данных, вы увидите, что в Пользователь Предприятие имеет ассоциацию, сделанную по объекту Aspnet_Roles 3.В XAML написать код, как показано ниже, чтобы связать выпадающий, к нужному полю DataForm

<Combobox DisplayMemberPath="RoleName" SelectedItem="{Binding MembershipRoleId,Mode=TwoWay}" .... /> 

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

  • Нет связанных вопросов^_^