Коллекция привязки Silverlight к Combobox в DataForm с использованием MVVM - PullRequest
2 голосов
/ 30 ноября 2009

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

Код:

<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, и этот ItemsSource = "{Binding Path = Languages, Mode = TwoWay}" не будет работать, но я понятия не имею, как достичь своей цели.

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

Ответы [ 3 ]

6 голосов
/ 01 декабря 2009

1) Объявите модель представления для представления в разделе ресурсов.

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

2) Свяжите ComboBox со свойством коллекции в модели представления.

<ComboBox ItemsSource="{Binding Path=Languages, 
                                Source={StaticResource myViewModel}, 
                                Mode=TwoWay}"/>
0 голосов
/ 30 декабря 2011

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

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

  2. Форма данных привязана к объекту B

  3. Поле со списком в форме данных заполняется списком
  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 напишите код, указанный ниже, чтобы связать комбинированный список с нужным полем формы данных

<Combobox DisplayMemberPath="RoleName" SelectedItem="{Binding MembershipRoleId,Mode=TwoWay}" .... />
0 голосов
/ 25 мая 2010

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

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