如何使用EventToCommand - XAML中的错误

时间:2014-11-25 12:31:07

标签: c# wpf mvvm mvvm-light

用户在TextBox中输入内容并点击Enter按钮。点击Enter按钮时,会调用AddFieldCommand。我如何在XAML中做什么?

我的代码给了我一个警告:“属性'文字'设置不止一次”。

我需要知道Canvas中哪个对象正在更新,所以我可以将TextBox中的内容添加到我的模型中 - 这就是我使用EventToCommand的原因。

<TextBox x:Name="txtFields" Text="{Binding FieldsTextProperty, UpdateSourceTrigger=PropertyChanged}" Height="23" TextWrapping="NoWrap" Background="#FFCBEECD" AcceptsReturn="False" >
    <TextBox.InputBindings>
        <KeyBinding Key="Enter" >
        </KeyBinding>
    </TextBox.InputBindings>
    <i:EventTrigger EventName="AddField">
        <cmd:EventToCommand Command="{Binding DataContext.AddFieldCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" PassEventArgsToCommand="True"/>
    </i:EventTrigger>
</TextBox>

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您可以使用 ICommand界面执行命令,并使用按钮的 IsDefault = true 属性,使其保持焦点。所以当您点击输入时,它将执行您在按钮上绑定的命令。

 <TextBox x:Name="txtFields" Text="{Binding FieldsTextProperty,UpdateSourceTrigger=PropertyChanged}" Height="23" TextWrapping="NoWrap" Background="#FFCBEECD" AcceptsReturn="False" />                            

      <Button Name="btnEnter" IsDefault="True" Command="{Binding DataContext.AddFieldCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" />

答案 1 :(得分:0)

在XAML中,放置在元素中的所有内容都将成为内容。对于文本框,这将设置Text属性。这是允许这样的事情:

<TextBox>Foo bar</TextBox>

因此,您可以将内容放在XAML元素中。这相当于:

<TextBox Text="Foo bar" />

现在,如果您查看XAML代码,您会注意到TextBox元素中有两个元素:TextBox.InputBindingsi:EventTrigger。要解释第一个,您需要知道还有另一种方法可以通过使用子元素来指定元素的属性值。这使得上面的例子等同于:

<TextBox>
    <TextBox.Text>Foo bar</TextBox.Text>
</TextBox>

这适用于TextBox的所有属性。现在,InputBindingsTextBox的属性,因此将其作为子元素将正确设置属性,它也不会影响元素的内容值(因此Text未设置由它的存在)。但是,i:EventTrigger不是TextBox的属性,因此这将设置TextBox的内容 - 给出您看到的错误消息。

要使用交互事件触发器,您需要将它们放入附加属性i:Interaction.Triggers。作为附加属性,可以使用上面的子元素进行设置。所以,你的代码应该是这样的:

<TextBox …>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="AddField">
            <cmd:EventToCommand … />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>