C# 如何让Enter键操作使用MVVM交叉从WPF调用PCL定义的属性

C# 如何让Enter键操作使用MVVM交叉从WPF调用PCL定义的属性,c#,wpf,xaml,mvvm,portable-class-library,C#,Wpf,Xaml,Mvvm,Portable Class Library,我的问题是,我希望在文本框中键入文本后按enter键。当我这样做时,我希望这会触发我的PCL中定义的viewmodel中的特定属性(这是无法更改的) 我已经看到一些例子,几乎做类似的事情,但他们只做标准的行动,如在文本框或标签到下一个控制等。我想让它与我选择的属性交互 HeaderView.xaml <views:MvxWpfView xmlns:views="clr-namespace:Cirrious.MvvmCross.Wpf.Views;assembly=Cirr

我的问题是,我希望在文本框中键入文本后按enter键。当我这样做时,我希望这会触发我的PCL中定义的viewmodel中的特定属性(这是无法更改的)

我已经看到一些例子,几乎做类似的事情,但他们只做标准的行动,如在文本框或标签到下一个控制等。我想让它与我选择的属性交互

HeaderView.xaml

<views:MvxWpfView
         xmlns:views="clr-namespace:Cirrious.MvvmCross.Wpf.Views;assembly=Cirrious.MvvmCross.Wpf"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:UI="clr-namespace:ProductCatalog.UserInterface.WPF.Bootstrap"
         x:Class="ProductCatalog.UserInterface.WPF.Views.HeaderView">
<Grid Height="70" Background="#005287">
        <TextBox DataContext="{Binding SearchText}" UI:TextBoxExtension.EnterKey="Search" 
                 Width="120" Height="35" Padding="8" Margin="10" HorizontalAlignment="Right" >
        </TextBox>
</Grid></views:MvxWpfView>
HeadServiceWModel.cs(在PCL中)

下面是当我在UI:textboxtension.EnterKey中使用参数
Search
时发生的情况。事件会按我所希望的方式触发,但它无法在我的ViewModel中找到我的搜索属性。当我尝试使用
{Binding Search}
时,事件从未触发。如何获取事件以触发ViewModel中的搜索属性


非常感谢

您是否尝试过使用输入绑定:

<TextBox>
    <TextBox.InputBindings>
        <KeyBinding Key="Enter" Command="{Binding DoSomething}"/>
    </TextBox.InputBindings>
</TextBox>

首先,应将附着的属性定义为

public static readonly DependencyProperty EnterKeyProperty = 
        DependencyProperty.RegisterAttached("EnterKey", typeof(ICommand), typeof(TextBoxExtension), new UIPropertyMetadata(EnterKeyPropertyChanged));


public static ICommand GetEnterKey(DependencyObject obj)
    {
        return (ICommand)obj.GetValue(EnterKeyProperty);
    }

    public static void SetEnterKey(DependencyObject obj, ICommand value)
    {
        obj.SetValue(EnterKeyProperty, value);
    }
这是为了区分附加属性和CLR属性

第二次绑定应按如下方式进行

 <TextBox DataContext="{Binding SearchText}" UI:TextBoxExtension.EnterKey="{Binding Search}" 
                 Width="120" Height="35" Padding="8" Margin="10" HorizontalAlignment="Right" >
        </TextBox>


我尝试过InputBindings,但是当按下enter键时,它不会执行。嗯,我不明白为什么它不应该执行。找出它不执行的原因将引导您找到问题的解决方案。但是您以前尝试过将
KeyBinding
用于文本框并成功了吗?因为我是WPF的新手,所以它很可能完全不同。我可以确认它确实有效,我正在我当前的项目中使用它。我正在使用MVVM Light,虽然我甚至无法让它在一个新的WPF项目中工作,除了
MainWindow.xaml
中的文本框和
MainWindow.xaml.cs
中的属性之外,没有任何内容。我只是不明白我在问题中所说的。当我将
{Binding Search}
而不是
Search
作为参数写入EnterKey时,不会调用Keydown。它只会说
绑定不能在文本框集合中使用。只能在DependencyObject的DependencyProperty上设置绑定
在输出窗口中是否有绑定失败?否,我找不到任何与绑定失败相关的内容。然而,我也看不出它是否有约束力,所以我假设出于某种原因,它没有约束力。我很抱歉将您转移到更复杂的解决方案。我想当然地认为您对
键绑定的使用是正确的,这确实不是您的选择;我应该自己仔细检查一下……如果我这样做了,我会发现
KeyBinding
可以按照您的要求正常工作,并且坚持要很好地显示您的问题,而不是为您寻找
KeyBinding
的替代品。也就是说:我自己编写了一个脚本,它只在
TextBox
上声明一个
KeyBinding
,以便在按下
Enter
时执行一个命令,并且工作正常。我将把它作为一个答案发布在这里,只是看到它正确地完成并不能帮助您理解为什么在您的代码中,在XAML中做同样的事情不会得到同样的结果。请改进您的问题,确保其中包含可靠再现问题的良好代码示例。您能否提供一个示例,说明
KeyBinding
with
Enter
keyas命令真正起作用,我已经在干净的解决方案上对此进行了多次测试,但始终无法使其发挥作用。我做错了什么@PeterDuniho@PeterDuniho我现在已经找到了解决我问题的办法。显然,有一个绑定实现了错误设置的功能。这使得整个问题变得沉默,因为它是有效的。既然你似乎对stackoverflow社区很了解,我该如何报告这一点,我是否要删除这个问题?我还是要感谢所有参与帮助我的人我很高兴你明白了。干得好至于这个问题,你需要问自己的首要问题是:“我的问题及其答案将来会帮助别人吗?”也就是说,有人可能会有同样的问题,并且在你的演讲和至少一个答案中找到他们问题的解决方案。考虑到这似乎本质上是您代码中的一个输入错误,该分析的答案可能是“不”。您可以投票结束您自己的问题(使用“离题/印刷错误”原因,或直接删除它)。
<TextBox>
    <TextBox.InputBindings>
        <KeyBinding Key="Enter" Command="{Binding DoSomething}"/>
    </TextBox.InputBindings>
</TextBox>
DoSomething = new RelayCommand(() => DoSomething(), () => true);
public static readonly DependencyProperty EnterKeyProperty = 
        DependencyProperty.RegisterAttached("EnterKey", typeof(ICommand), typeof(TextBoxExtension), new UIPropertyMetadata(EnterKeyPropertyChanged));


public static ICommand GetEnterKey(DependencyObject obj)
    {
        return (ICommand)obj.GetValue(EnterKeyProperty);
    }

    public static void SetEnterKey(DependencyObject obj, ICommand value)
    {
        obj.SetValue(EnterKeyProperty, value);
    }
 <TextBox DataContext="{Binding SearchText}" UI:TextBoxExtension.EnterKey="{Binding Search}" 
                 Width="120" Height="35" Padding="8" Margin="10" HorizontalAlignment="Right" >
        </TextBox>