2015-08-09 4 views
0

Сегодня я использую конструктор для получения массива, а затем привязываю его к элементу.Рефакторинг создания привязки от кода-основанного на основе XAML

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}" />--> 

Конечно, класс Вещи содержит ряд полей, один из которых называется CANONIC и содержит строку для визуализации в описании опции. Элемент управления, создающий диалог, имеет тип 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 ... 
    } 
} 
+0

Пожалуйста, предоставьте код для 'MainWindow.cs' или' ProgramWindow.cs', чтобы немного разобраться. –

+0

@Bahman_Aries Я сделаю это. Однако, чтобы держать вещи плотными и читаемыми, я хотел бы только опубликовать соответствующие части. Что именно вам нужно увидеть из кода? Я опубликую конструктор и создаю диалог. Дайте мне знать, слишком ли много или слишком мало. –

ответ

1

Проблема заключается в том, что вы пытаетесь получить доступ к DataContext другого Window с использованием RelativeSource связывания , Связывание RelativeSource может обращаться только к элементам внутри одного и того же визуального дерева, а к другому Window невозможно получить доступ таким образом.

+0

Это не отвечает на вопрос. Я считаю, что вы в заблуждение относительно того, что моя проблема возникает - * TheActualThings * ** не является частью * материала ***, поэтому я не могу привязываться к нему обычным способом. Фактически, если вы просмотрите конструктор, вы увидите, что мне нужно обеспечить параллель (и называть его * вещами * в принимающем параметре). –

+0

Я также разместил части родителя. Полюбуйтесь взглянуть - возможно, это проясняет некоторые путаницы. –

+0

Поскольку вы редактировали вопрос, я сейчас не понимаю, как все это сочетается. –

 Смежные вопросы

  • Нет связанных вопросов^_^