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

时间:2009-11-30 16:12:57

标签: silverlight data-binding mvvm combobox dataform

我有这个问题,我已经使用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");
            }
        }
    }

现在,除了将ItemSource添加到ComboBox之外,所有这些都有效。我发现很多例子显示如何在CodeBehind中填充CB,但就像我说我想在MVVM-Style中这样做:) 据我所知,ComboBox从DataForm继承了DataContext,而这个ItemsSource =“{Binding Path = Languages,Mode = TwoWay}”将不起作用,但我不知道如何实现我的目标。

有人能帮助我吗?

3 个答案:

答案 0 :(得分:6)

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}"/>

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

  1. 让我们说 User.MembershipRoleId 将绑定到 Aspnet_Role.RoleId

  2. Dataform绑定到ObjectB

  3. 数据表格中的Combobox填充了List
  4. 在XAML中写下以下内容:

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

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

    情景B: 1.如果您不想通过ScenarioA中的方式显式定义,那么在这种情况下,在数据库中的表之间定义一个ForeignKey-PrimaryKey关系 ForeignKey - &gt; User.MembershipId PrimaryKey - &gt; Aspnet_Roles.RoleId 2.从ADO.NET(.edmx)文件中,从数据库更新模型,您将观察到在用户实体中,实体与 Aspnet_Roles 之间存在关联。 3.在XAML中,编写如下代码以将组合框绑定到Dataform的所需字段

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