xamlバインディングでデータセットの親関係をフォローアップする方法は本当にありませんか?
-
03-07-2019 - |
質問
これらの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>