3

我有一个可编辑的组合框。

<ComboBox IsEditable="True">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}"/>
        </i:EventTrigger>
        <i:EventTrigger EventName="TextBoxBase.TextChanged">
            <cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>

我使用 GalaSoft.MvvmLight.Command.EventToCommand 来绑定 SelectionChanged 事件。
我也想绑定 TextChanged 事件,但有点棘手:该事件只能由 ComboBox TextBoxBase 属性访问,我找不到绑定该事件的正确方法。
您可以看到我的一次失败尝试:SelectionChanged 绑定工作正常,但 TextChanged 绑定不行。

我也试过这个语法:

<ComboBox IsEditable="True">
    <TextBoxBase>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="TextChanged">
                <cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBoxBase>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>

但这甚至不会编译。我在 TextBoxBase 标记上收到错误“可以预期实例化的类型”。

任何想法 ?

4

2 回答 2

5

我知道,回复很晚......但我希望它会帮助某人。

这里的问题是EventTrigger该类Microsoft.Expression.Interactivity.dll用于reflection通过属性的值来查找事件,EventName这对于附加事件(如TextBoxBase.TextChanged.

我使用的一种选择是实现您自己的自定义EventTrigger类,如此处所述,并使用这个而不是 EventTrigger(那里的CommandAction实现链接已损坏,但我设法使用互联网档案获得它)。

另一个我不喜欢的选项,因为它不是经典MVVM Command用途,所以将 的Text属性绑定ComboBox到 中的属性ViewModel并从 setter 上的 ViewModel 代码调用命令,如下所示:

<ComboBox IsEditable="True"
          Text="{Binding Text, Mode=TwoWay}" />

在 ViewModel 中:

private string text;
public string Text
{
    get { return text; }
    set
    {
       text = value;
       OnPropertyChanged("Text");
       if(CritereChangedCommand.CanExecute())
          CritereChangedCommand.Execute();//call your command here
    }
}
于 2016-06-04T22:33:13.407 回答
3

我找到了解决该问题的方法:
我创建了一个不可见的 TextBox,绑定到 ComboBox,并将命令绑​​定到 TextBox 的 TextChanged 事件上。它不漂亮,但它的工作...

<ComboBox Name="CbRubrique" IsEditable="True">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>
<TextBox Text="{Binding ElementName=CbRubrique, Path=Text, UpdateSourceTrigger=PropertyChanged}" Visibility="Collapsed">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="TextChanged">
            <cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>
于 2013-08-30T08:33:40.330 回答