使用MVVM将Silverlight绑定到DataForm中的Combobox

我有这个问题,我已经使用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}“将不起作用,但我不知道如何实现我的目标。

有人能帮助我吗?


1)在资源部分声明viewmodel到视图。

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

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

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

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

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

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

  • 让我们说User.MembershipRoleId是绑定到Aspnet_Role.RoleId

  • Dataform绑定到ObjectB

  • 数据表单中的组合框用List填充
  • 在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)文件中,更新数据库中的模型,您会发现在User实体中存在一个根据实体Aspnet_Roles 3生成的关联。在XAML中,编写如下代码以绑定组合框, Dataform的所需字段

    <Combobox DisplayMemberPath="RoleName" SelectedItem="{Binding MembershipRoleId,Mode=TwoWay}" .... />
    
    链接地址: http://www.djcxy.com/p/44615.html

    上一篇: Silverlight bind collection to Combobox in DataForm using MVVM

    下一篇: WPF How do I evaluate a property to make binding