2014-01-20 2 views
1

У меня есть RibbonApplicationMenu в моем приложении аналогично этот пример:Различного поведения в RibbonApplicationMenu команда

<RibbonApplicationMenu> 
    <RibbonApplicationMenuItem Header="Open Project..." Command="{Binding OpenProjectCommand}" /> 
    <RibbonApplicationMenuItem Header="Save Project..." Command="{Binding SaveProjectCommand}" /> 
    <RibbonApplicationMenuItem Header="Exit" Command="{Binding CloseWindowCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type RibbonWindow}}}" /> 
    <RibbonApplicationMenu.FooterPaneContent> 
     <RibbonButton Label="Exit" Command="{Binding CloseWindowCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type RibbonWindow}}}" /> 
    </RibbonApplicationMenu.FooterPaneContent> 
</RibbonApplicationMenu> 

private void CloseWindow (Object parameter) 
{ 
    ((Window) parameter).Close(); 
} 

В примере есть элемент RibbonApplicationMenuItem и RibbonButton связан с одной и той же командой и имеющие один и тот же параметр, передаваемым. Команда выполняет функцию CloseWindow(). Мне любопытно, что при нажатии кнопки RibbonApplicationMenuItem параметр функции является указателем на RibbonWindow. Однако при нажатии кнопки RibbonButton параметр функции равен нулю.

Почему поведение должно отличаться?

ответ

1

Установка FooterPaneContent будет другим элементом управления (RibbonButton) беспорядок вверх по логическому дереву, поэтому RelativeAncestor не работает.

В Другими словами, даже если вы связываете с самой кнопки, проходя с LogicalTreeHelper не будет работать (VisualTreeHelper не будет работать, так как стекло является PopUp и живет в отдельном визуальном дереве):

<r:RibbonApplicationMenu.FooterPaneContent> 
    <r:RibbonButton Label="Exit" Command="{Binding CloseWindowCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" /> 
</r:RibbonApplicationMenu.FooterPaneContent> 
private void CloseWindow(object parameter) 
{ 
    RibbonButton _button = (RibbonButton)parameter; 

    // _appMenu will be null 
    DependencyObject _appMenu = LogicalTreeHelper.GetParent(_button); 
} 

Итак, ваши варианты:

  1. Привязать к себе и использовать _button.Ribbon свойство для получения Ribbon и перейдите по логическому дереву, чтобы получить RibbonWindow.

  2. Комплект ContentTemplate вместо Content. Будьте осторожны, чтобы распространять DataContext.

<r:RibbonApplicationMenu.FooterPaneContentTemplate> 
    <DataTemplate> 
     <r:RibbonButton Label="Exit" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type r:RibbonApplicationMenu}}, Path=DataContext}" Command="{Binding Path=CloseWindowCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type r:RibbonWindow}}}" /> 
    </DataTemplate> 
</r:RibbonApplicationMenu.FooterPaneContentTemplate> 
private void CloseWindow(object parameter) 
    { 
     ((Window)parameter).Close(); 
    } 
+1

Что бы нормальный способ положить кнопку закрытия в сноске? –

+1

Я бы сказал, второй вариант. (Извините за задержку!) – Dusan

+0

Второй вариант исправил мою проблему. Странно, у меня не было ошибки привязки в окне «Выход», хотя он не смог найти мой CloseWindowCommand. –

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