xamlバインディングでデータセットの親関係をフォローアップする方法は本当にありませんか?

StackOverflow https://stackoverflow.com/questions/202990

質問

これらの2つの不滅のテーブルを持つデータセットがあるとします:Employee&注文
空欄-> ID、名前
Ord ->何か、別のもの、EmpID
リレーション Rel :Ord(EmpID)-> Emp(ID)

標準のマスター/詳細シナリオでうまく機能します
(従業員の表示、関係のフォロー、関連する注文の表示)、
しかし、逆の方法(Emp.NameでOrdテーブルを表示)にしたくない場合はどうなりますか?

次のようなもの:

<stackpanel>   // with datacontext set from code to dataset.tables["ord"]
   <TextBox Text="{Binding Something}"/>
   <TextBox Text="{Binding Anotherthing}"/>
   <TextBox Text="{Binding ???}"/> // that's my problem, how to show related Emp.Name 
</stackpanel>

アイデアはありますか?値コンバーターを作成できますが、親モジュールから取得したデータセットインスタンスを使用したくない場合は注意が必要です。

役に立ちましたか?

解決

複数のコントロールのコンテンツを同期する場合は、共通の親コントロールに設定された DataContext を介して同じバインディングソースを共有する必要があります。次に例を示します。

<StackPanel>
    <StackPanel.Resources>
        <ObjectDataProvider x:Key="ds" ObjectType="{x:Type mynamespace:MyDataSet}" />
    </StackPanel.Resources>

    <!-- We set the data context to the collection of rows in the table -->
    <StackPanel DataContext="{Binding Source={StaticResource ds}, Path=USERS.Rows}">
        <ListBox ItemsSource="{Binding}"
                 DisplayMemberPath="NAME"
                 IsSynchronizedWithCurrentItem="True" />
        <TextBox Text="{Binding Path=NAME}"/>
        <TextBox Text="{Binding Path=COUNTRIESRow.NAME}"/>
    </StackPanel>
</StackPanel>

IsSynchronizedWithCurrentItem プロパティを「True」に設定すると、 ListBox.SelectedItem プロパティが、 CollectionView.CurrentItem と自動的に同期されます。バインディングソース、つまり DataContext で設定された行のコレクション。これは、ListBoxで現在選択されている行が2つのTextBoxコントロールのバインディングソースになることを意味します。

他のヒント

厳密に型指定されたDataSetを使用していると仮定すると、TextBoxを 'EmpRow.Name'プロパティにバインドするには、おそらく 'OrdDataTable'クラスのプロパティとして公開する必要があります。

Visual Studioは部分クラスを持つ型指定されたDataSetコードを生成するため、次の方法でプロパティを「OrdDataTable」クラスに追加できます。

using System.Data;

public partial class OrdDataTable : DataTable
{
    public string EmpName
    {
        get { return this.EmpRow.Name; }
    }
}

その後、データコンテキストの「OrdDataTable」オブジェクトの「EmpName」プロパティにバインドできます。

2つのTextBoxコントロールのDataContextとは何ですか?
2番目のバインディングが機能するには、 DataContext を「USERSDataTable」のインスタンスに設定する必要があります。これらはDataSetの配列に含まれているため、どのテーブルにバインドするかを明示的に指定する必要があります。次のようなもの:

<StackPanel>
    <StackPanel.Resources>
        <ObjectDataProvider x:Key="ds" ObjectType="{x:Type mynamespace:MyDataSet}" />
    </StackPanel.Resources>

    <!-- Notice we set the data context to the first item in the array of tables -->
    <StackPanel DataContext="{Binding Source={StaticResource ds}, Path=USERS[0]}">
        <TextBox Text="{Binding NAME}"/>
        <TextBox Text="{Binding COUNTRIESRow.NAME}"/>
    </StackPanel>
</StackPanel>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top