首页 > 解决方案 > 在 TabControl.ContentTemplate 中定义时,如何将 MouseEventArgs.Source 作为 TextBox

问题描述

prism InvokeCommandAction用来绑定Window.PreviewMouseDownMainWindowViewModel. 然后我有一个TabControlwhoItemsSource与 anObservableCollection<ItemViewModel>和 theTabControl.ContentTemplate有界ItemViewModel.ItemContent

问题是当ItemViewModel.ItemContentis/has a TextBoxand 被点击时, theMouseEventArgs.SourceTabControl.

我希望MouseEventArgs.Source成为TextBox当我绑定到 aContentControl.Content外部时会发生的情况TabControl.ContentTemplate

以下是复制代码:

主窗口.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; }
    }
}

标签: wpfdata-bindingprism

解决方案


推荐阅读