2

我有这个问题,我有使用 MVVM 编写的 Silverlight 应用程序。我需要创建绑定到 ViewModel 上的属性的 DataForm,我想添加 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 之外,所有这些都有效。我找到了很多例子来展示如何在 CodeBehind 中填充 CB,但就像我说的我想在 MVVM 样式中执行此操作:) 我明白,ComboBox 从 DataForm 继承 DataContext,并且这个 ItemsSource="{Binding Path=Languages, Mode =TwoWay}" 不起作用,但我不知道如何实现我的目标。

有人可以帮助我吗?

4

3 回答 3

6

1)在资源部分中将视图模型声明为视图。

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

2) 将 ComboBox 绑定到 viewmodel 上的集合属性。

<ComboBox ItemsSource="{Binding Path=Languages, 
                                Source={StaticResource myViewModel}, 
                                Mode=TwoWay}"/>
于 2009-12-01T05:25:30.240 回答
0

场景 A: 1. 假设您希望使用所有成员角色填充一个组合,并允许客户端选择角色并分配给用户:即 ObjectA:Aspnet_Role 即 ObjectB:用户

  1. 假设User.MembershipRoleId将绑定到Aspnet_Role.RoleId

  2. Dataform 绑定到 ObjectB

  3. 数据表单中的组合框填充有列表
  4. 在 XAML 中编写以下内容:

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

这里的映射是 ObjectB.MembershipRoleId=ObjectA.RoleId

场景B: 1. 如果不想在场景A中顺便显式定义,那么在这种情况下,在数据库中的表之间定义一个ForeignKey-PrimaryKey关系,如ForeignKey -> User.MembershipId PrimaryKey -> Aspnet_Roles.RoleId 2 . 从 ADO.NET (.edmx) 文件中,从数据库中更新模型,您将观察到在User实体中,实体Aspnet_Roles上有一个关联 3. 在 XAML 中编写如下代码来绑定组合框,以数据表单的所需字段

<Combobox DisplayMemberPath="RoleName" SelectedItem="{Binding MembershipRoleId,Mode=TwoWay}" .... />
于 2011-12-29T20:33:59.410 回答
0

您可以将 XAML 中的数据上下文设置为静态资源,如下所示:

<UserControl.DataContext>
    <Binding Source="{StaticResource myViewModel}" />
</UserControl.DataContext>
于 2010-05-25T07:10:32.890 回答