WPF Выполняет команду ICommand в главном окне из пользовательского элемента управления внутри страницы

#c# #wpf #data-binding

Вопрос:

Я показываю список заказов (каждый заказ-это пользовательский элемент управления) более чем на одной странице. Каждый раз, когда пользователь щелкает левой кнопкой мыши элемент управления, главное окно должно загружаться и отображать заказ на новой странице с помощью команды ICommand.

x:Имя главного окна: Главное окно

Mainviewмодель

Это модель представления, связанная с главным окном.

 public class MainViewModel : BaseViewModel
{
    public INavigator Navigator { get; set; }
    public ICommand OpenOrderCommand { get; set; }

    public MainViewModel(INavigator navigator) : base()
    {
        Navigator = navigator;
        OpenOrderCommand = new RelayCommand(OpenOrder);
    }

    private void OpenOrder(object obj)
    {
        // Loads the order from db
    }
}
 

Я добавил тег InputBindings в UserControl, чтобы определить, когда пользователь щелкает по нему левой кнопкой мыши.

Пользовательский контроль

 <Grid.InputBindings>
    <MouseBinding MouseAction="LeftClick" 
        Command="{Binding DataContext.OpenOrderCommand,
                          RelativeSource={RelativeSource Mode=FindAncestor, 
                          AncestorType={x:Type Window}}}"
        CommandParameter="{Binding OrderId}"/>
</Grid.InputBindings>
 

Но OpenOrderCommand никогда не запускается, и я получаю сбой привязки XAML с этим текстом:

Система.Windows.Ошибка данных: 4 : Не удается найти источник для привязки со ссылкой ‘RelativeSource FindAncestor, AncestorType=’Система.Windows.Окно’, уровень предка=’1″. Выражение привязки:Путь=DataContext.OpenOrderCommand; DataItem=null; целевой элемент — «Привязка мыши» (хэш-код=20815867); целевое свойство — «Команда» (тип «ICommand»)

Как я могу выполнить команду главного окна из пользовательского элемента управления?

Обновить

Это прекрасно работает, если я использую текущую страницу вместо главного окна.

 <Grid.InputBindings>
    <MouseBinding MouseAction="LeftClick" 
        Command="{Binding DataContext.OpenOrderCommand,
                          RelativeSource={RelativeSource Mode=FindAncestor, 
                          AncestorType={x:Type local:HomePage}}}"
        CommandParameter="{Binding OrderId}"/>
</Grid.InputBindings>
 

Комментарии:

1. Вы установили значение параметра Background-Peroperty сетки? Если нет, попробуйте установить значение. Прозрачность также должна работать.

2. @Mardukar все еще не работает.

Ответ №1:

В сообщении об ошибке говорится, что он не может найти источник привязки. Попробуй связать его вот так:

 <Grid.InputBindings>
        <MouseBinding MouseAction="LeftClick" 
                      Command="{Binding OpenOrderCommand}"
                      CommandParameter="{Binding OrderId}"/>
</Grid.InputBindings>
 

и установить DataContext следующим образом:

 public MainWindow()
{
     InitializeComponent();
     DataContext = new MainViewModel();
}
 

В моем тестовом коде Сетка вызывала событие только тогда, когда я явно задавал значение для свойства Фона. Прозрачность также была ценностью, которая работала.