0

今日は、コンストラクターを使用して配列を受け取り、それを要素にバインドしています。

C#

public MyDialog(Stuff stuff, IEnumerable<Thing> things)
{
  InitializeComponent();
  DataContext = stuff;
  MyComboBox.SetBinding(ComboBox.ItemsSourceProperty, new Binding { Source = things });
  ShowDialog();
}

XAML

<ComboBox x:Name="MyComboBox"
          DisplayMemberPath="Canonic"
          Style="{StaticResource DefaultComboBoxStyle}" />

純粋に XAML ベースのアプローチにリファクタリングしたいと思います。次の方法でアプローチしました。ただし、コンボ ボックスに値が表示されず、トラブルシューティングの方法がよくわかりません。

<ComboBox x:Name="MyComboBox"
          ItemsSource="{Binding 
            RelativeSource={
              RelativeSource FindAncestor,
              AncestorType={x:Type Window}},
            Path=DataContext.TheActualThings}"
          DisplayMemberPath="Canonic"
          Style="{StaticResource DefaultComboBoxStyle}" />-->

もちろん、Thingsクラスには多数のフィールドが含まれており、そのうちの 1 つはCanonicと呼ばれ、オプションの説明としてレンダリングする文字列が含まれています。ダイアログを作成するコントロールは、Windowから派生したProgramWindow型です。

同様の質問があることに注意してください(表示される場合があります)が、違いは、他の質問には構文の問題があり、それが解決されると、ここで説明されている実際の技術的な問題があることです。(他の質問へのリンクは提供していません。これは、ビューのカウントに影響を与えたくないためです。)

public partial class ProgramWindow : Window
{
  public ProgramWindow()
  {
    InitializeComponent();
    DataContext = new ViewModel();
  }

  private void DataGridRow_OnDoubleClick(Object sender, MouseButtonEventArgs eventArgs)
  {
    MyDialog dialog = new MyDialog(
      (sender as DataGridRow).Item as Stuff,
      (DataContext as ViewModel).TheActualThings);

    if (dialog.DialogResult ?? false) ...
    else ...
  }
}
4

1 に答える 1

1

問題は、RelativeSource バインディングを使用してDataContext別のにアクセスしようとしていることです。バインディングは同じビジュアル ツリー内の要素にのみアクセスでき、他の要素にはWindowこの方法でアクセスできません。RelativeSourceWindow

于 2015-08-09T11:18:15.467 に答える