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をビューモデルのコレクションプロパティにバインドします。

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

XAMLのデータコンテキストを次のように静的リソースに設定できます。

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

シナリオA: 1.コンボにすべてのメンバーシップロールを設定し、クライアントがロールを選択してユーザーに割り当てることを許可するとします。つまり、ObjectA:Aspnet_Role、つまりObjectB:ユーザー

  1. User.MembershipRoleIdがAspnet_Role.RoleIdにバインドされるとしましょう

  2. データフォームはObjectBにバインドされています

  3. データフォームのコンボボックスにはリストが入力されます
  4. XAMLで次のように記述します。

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

ここでのマッピングは、ObjectB.MembershipRoleId=ObjectA.RoleIdです。

シナリオB: 1.シナリオAで明示的に定義したくない場合は、ForeignKey-> User.MembershipId PrimaryKey->Aspnet_Roles.RoleId2のようにデータベース内のテーブル間にForeignKey-PrimaryKey関係を定義します。 。ADO.NET(.edmx)ファイルから、データベースからモデルを更新すると、UserエンティティにエンティティAspnet_Roles 3で関連付けが行われていることがわかります。XAMLでは、コンボボックスをバインドする次のコードを記述します。データフォームの目的のフィールド

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