当输入控件(来自另一个用户控件)在WPF中设置为焦点时,如何在主窗口中显示浮动虚拟键盘(用户控件)?

当输入控件(来自另一个用户控件)在WPF中设置为焦点时,如何在主窗口中显示浮动虚拟键盘(用户控件)?,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,我已经在使用MVVM模式的WPF应用程序中进行了几天的开发工作。我对WPF和MVVM模式也很陌生 在我的场景中,我有一个用户控件视图(名为EPayView.xaml),它有一个文本框,可以接受电话号码。该视图具有相应的viewmodel(名为EPayViewModel.cs)。在MainWindow.xaml中,我有一个用户控件(浮动虚拟键盘),它派生自命名空间控件WpfKb.controls。MainWindow.xaml还具有相应的viewmodel(名为MainViewModel.cs)

我已经在使用MVVM模式的WPF应用程序中进行了几天的开发工作。我对WPF和MVVM模式也很陌生

在我的场景中,我有一个用户控件视图(名为EPayView.xaml),它有一个文本框,可以接受电话号码。该视图具有相应的viewmodel(名为EPayViewModel.cs)。在MainWindow.xaml中,我有一个用户控件(浮动虚拟键盘),它派生自命名空间控件WpfKb.controls。MainWindow.xaml还具有相应的viewmodel(名为MainViewModel.cs)

话虽如此,我已经研究了如何使用附加的依赖属性,这使我找到了这个解决方案。我相信这就是我可以绑定属性的地方,它集中在EPayView.xaml的文本框中

下面是我已经在解决方案中包含的代码

EpayView.xaml(文本框xaml标记)


MainWindow.xaml(xaml标记)


在上面的代码中,用户控件RollPanel.BottomContent将EPayView.xaml视图托管在另一个视图(RollPanel.xaml)中

EpayViewModel.cs包含IsFocused附加属性的静态类FocusExtension(请参阅此解决方案-)。并且,EPayViewModel.cs已经实现了INotifyPropertyChanged,它被包装在接受T类型的具体类ObserveObject中。这与MainViewModel.cs也是一样的

public class EPayViewModel : ObservableObject<EPayViewModel>, IPaymentViewModel, IActiveViewModel
{ ... }

public class MainViewModel : ObservableObject<MainViewModel>
{ ... }
公共类EPayViewModel:ObserveObject、IPaymentViewModel、IActiveViewModel
{ ... }
公共类MainViewModel:ObserveObject
{ ... }
因此,我的目标是,当EPayView.xaml中的文本框具有焦点时,MainWindow.xaml中的浮动虚拟键盘(floatKb)将显示出来

我一直在思考如何继续(我在想,如果在MainViewModel.cs中调用EPayViewModel中的FocusExtension静态类就足够了?),非常感谢您的帮助

干杯,

正如AnjumSKhan已经说过的,要以MVVM的方式对某些事件做出反应,您必须使用
命令
。可以在
EventTrigger
中调用命令,您需要添加对
System.Windows.interactivity
组件的引用。 假设您有一个简单的视图和视图模型,并且需要在主窗口中的文本框获得焦点时显示此视图

查看(NewWindow.xaml)

您还有一个主窗口,它是应用程序的主视图,其中包含目标
文本框
。您可能会看到文本框中添加了一个EventTrigger,它有一个属性
InvokeCommandAction
,该属性绑定到名为
ShowCommand
MainWindowViewModel
命令

主窗口

<Window x:Class="My.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" Title="MainWindow" Height="350" Width="525">
<TextBox Height="40" Text="{Binding Text}">
    <Interactivity:Interaction.Triggers>
        <Interactivity:EventTrigger EventName="GotFocus">
            <Interactivity:InvokeCommandAction Command="{Binding ShowCommand}"/>
        </Interactivity:EventTrigger>
    </Interactivity:Interaction.Triggers>
</TextBox>
剩下的就是创建一个新的MainWindowViewModel并为MainWindow设置一个DataContext

public MainWindow()
{
    InitializeComponent();
    var mvm = new MainWindowViewModel();
    mvm.Text = "Focus me!";
    DataContext = mvm;
}

希望它能有所帮助。

使用
命令
这是一条路。@AnjumSKhan,我该如何使用该命令?我是MVVM的新手。对不起,非常感谢。我还没有试过你的解决办法。但是,我真的很感激。这确实是了解如何使用命令的良好开端。
<Window x:Class="My.NewWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="NewWindow" Height="300" Width="300">
<TextBlock Text="{Binding Message}"/>
public class NewWindowViewModel
{
    private string _message;
    public string Message
    {
        get { return _message; }
        set { _message = value; }
    }
}
<Window x:Class="My.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" Title="MainWindow" Height="350" Width="525">
<TextBox Height="40" Text="{Binding Text}">
    <Interactivity:Interaction.Triggers>
        <Interactivity:EventTrigger EventName="GotFocus">
            <Interactivity:InvokeCommandAction Command="{Binding ShowCommand}"/>
        </Interactivity:EventTrigger>
    </Interactivity:Interaction.Triggers>
</TextBox>
public class MainWindowViewModel
{
    private string _text;
    public string Text
    {
        get { return _text; }
        set { _text = value; }
    }

    private ICommand _increaseCommand;
    public ICommand ShowCommand
    {
        get
        {
            if (_increaseCommand == null)
            {
                _increaseCommand = new RelayCommand(
                p => true,
                Show);
            }
            return _increaseCommand;
        }
    }

    private void Show(object obj)
    {
        var w = new NewWindow();
        var nvm = new NewWindowViewModel();
        nvm.Message = "Test";
        w.DataContext = nvm;
        w.Show();
    }
}
public MainWindow()
{
    InitializeComponent();
    var mvm = new MainWindowViewModel();
    mvm.Text = "Focus me!";
    DataContext = mvm;
}