Связывание SelectedItem из ComboBox из отдельного управляющего файла XAML - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть ComboBox в меню ленты приложения, где выбранный элемент привязывается к теме пользовательского интерфейса приложения следующим образом:

Связывание темы в MainWindow.xaml

Theme="{Binding SelectedItem.Tag, ElementName=_themeCombo}"

И ComboBox

<ComboBox x:Name="_themeCombo" SelectedIndex="0" Width="200">
    <ComboBoxItem Content="Generic" />
    <ComboBoxItem Content="Aero">
        <ComboBoxItem.Tag>
            <xcad:AeroTheme />
        </ComboBoxItem.Tag>
    </ComboBoxItem>
</ComboBox>

Выбор темы работал хорошо, однако, поскольку MainWindow.xaml становится очень длинным, я переместил свою ленту меню (и, следовательно, поле со списком) в отдельный файл UserControl с именем "Ribbon.xaml" и сослался на него как следующим образом:

<local:Ribbon x:Name="RibbonWin" Grid.Row="0" />

Это, однако, нарушило обязательную ссылку для выбора моей темы. Ribbon.xaml находится в том же пространстве имен, что и mainwindow.xaml.

Как указать относительный путь к ленте ComboBox с именем «_themeCombo»?

Я попытался поместить полный адрес ComboBox в (имя класса inc для ленты) следующим образом, но это не сработало:

Theme="{Binding SelectedItem.Tag, ElementName=DrainageDesign.View.Ribbon._themeCombo}"

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете добавить свойство зависимости к вашему Ribbon UserControl и использовать его для передачи значения. Обратите внимание, что вы можете использовать более конкретный тип, чем object для вашей фактической темы

public object SelectedTheme
{
    get { return (object)GetValue(SelectedThemeProperty); }
    set { SetValue(SelectedThemeProperty, value); }
}

public static readonly DependencyProperty SelectedThemeProperty =
    DependencyProperty.Register("SelectedTheme", typeof(object), typeof(Ribbon), new FrameworkPropertyMetadata());

Затем привяжите выбранную тему к свойству

<local:Ribbon x:Name="RibbonWin"
              SelectedTheme="{Binding SelectedItem.Tag, ElementName=_themeCombo}"
              Grid.Row="0" />

И используйте переданное значение внутри ленты. Я предполагаю, что вы даете своему Ribbon UserControl внутреннее имя _self для этого примера. Вы можете использовать любую выбранную вами технику для доступа к собственности, находящейся под вашим контролем.

Theme="{Binding SelectedTheme, ElementName=_self}"
...