重构基于代码隐藏的绑定的创建基于基于XAML的

时间:2015-08-09 11:12:40

标签: c# wpf xaml data-binding relativesource

今天我使用构造函数接收数组,然后将其绑定到元素。

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 包含许多字段,其中一个字段称为 Canonic ,并包含要呈现为选项说明的字符串。创建对话框的控件的类型为 ProgramWindow ,源自 Window

请注意,有一个类似的问题(可能会出现),但区别在于,另一方面,我有语法问题,一旦解决了,就会出现实际的技术问题这里描述。 (我没有给出另一个问题的链接,因为我不想影响它的观看次数。)

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 ...
  }
}

1 个答案:

答案 0 :(得分:1)

问题是您尝试使用RelativeSource绑定访问另一个DataContext的{​​{1}}。 Window绑定只能访问同一个可视树中的元素,而另一个RelativeSource无法以这种方式访问​​。