Как получить MouseEventArgs.Source в качестве TextBox при определении внутри TabControl.ContentTemplate - PullRequest
0 голосов
/ 01 ноября 2018

Я использую prism InvokeCommandAction, чтобы связать Window.PreviewMouseDown с MainWindowViewModel. Затем у меня есть TabControl, ItemsSource которого ограничен ObservableCollection<ItemViewModel>, а TabControl.ContentTemplate - ItemViewModel.ItemContent.

Проблема в том, что когда ItemViewModel.ItemContent имеет / имеет TextBox и нажата, MouseEventArgs.Source является TabControl.

Я бы хотел, чтобы MouseEventArgs.Source был TextBox, что происходит, когда я просто связываюсь с ContentControl.Content вне TabControl.ContentTemplate.

Ниже приведен код для воспроизведения:

MainWindow.xaml

<Window
    x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:WpfApp1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:prism="http://prismlibrary.com/"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="PreviewMouseDown">
            <prism:InvokeCommandAction Command="{Binding PreviewMouseDownCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <StackPanel>
        <ContentControl Content="{Binding SingleItemContent}" />
        <TabControl ItemsSource="{Binding ItemViewModels}">
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <ContentControl Content="{Binding ItemContent}" />
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </StackPanel>
</Window>

MainWindowViewModel.cs

using Prism.Commands;
using Prism.Mvvm;
using System.Collections.ObjectModel;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApp1
{
    public class MainWindowViewModel : BindableBase
    {
        public MainWindowViewModel()
        {
            PreviewMouseDownCommand = new DelegateCommand<MouseEventArgs>(PreviewMouseDown);

            PopulateItems();
        }

        public ICommand PreviewMouseDownCommand { get; }

        private void PreviewMouseDown(MouseEventArgs e)
        {
            /// if SingleItemContent is clicked
            /// e.Source is TextBox

            /// if an ItemViewModel.ItemContent is clicked
            /// e.Source is TabControl
        }

        private void PopulateItems()
        {
            ItemViewModels.Add(new ItemViewModel
            {
                ItemContent = new TextBox()
            });

            SingleItemContent = new TextBox();
        }

        public ObservableCollection<ItemViewModel> ItemViewModels { get; } = new ObservableCollection<ItemViewModel>();

        public object SingleItemContent { get; set; }
    }
    public class ItemViewModel
    {
        public object ItemContent { get; set; }
    }
}
...