ItemsControl + Textbox + MVVM + EventTrigger未触发

时间:2013-02-14 04:53:36

标签: silverlight xaml mvvm eventtrigger

由于我在一个ItemsControl中移动了View,因此我无法在ViewModel中触发EventTrigger。这是我的“Commmand宣言”,应该在LostFocus上发布:

public ICommand UpdateOrdersCommand { get; set; }
public void UpdateOrders(object param)
{
    UpdateFields();
}

我的容器XAML:

<UserControl.Resources>
  <WMS:PurchasingModel x:Key="ViewModel" />
  <DataTemplate x:Key="myDataTemplate1">
    <WMSViews:Purchasing1 />
  </DataTemplate>
</UserControl.Resources>

<Grid x:Name="LayoutRoot"
      Background="White"
      DataContext="{StaticResource ViewModel}">
  <ItemsControl ItemsSource="{Binding Path=ColPurchasing}"
                ItemTemplate="{StaticResource     myDataTemplate1}">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Vertical" />
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
  </ItemsControl>
</Grid>

我的视图EvenTrigger用于在LostFocus上触发的位置:

<Classes:TextBoxEx TabIndex="1"
                   x:Name="tbFoodSales"
                   HorizontalAlignment="Left"
                   Height="23"
                   Margin="55,79,0,0"
                   TextWrapping="Wrap"
                   VerticalAlignment="Top"
                   Width="61"
                   TextAlignment="Right"
                   Text="{Binding Path=FoodSales, Mode=TwoWay}">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="LostFocus">
      <i:InvokeCommandAction Command="{Binding UpdateOrdersCommand}" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Classes:TextBoxEx>

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式绑定元素:

<Classes:TextBoxEx TabIndex="1"
                   x:Name="tbFoodSales"
                   HorizontalAlignment="Left"
                   Height="23"
                   Margin="55,79,0,0"
                   TextWrapping="Wrap"
                   VerticalAlignment="Top"
                   Width="61"
                   TextAlignment="Right"
                   Text="{Binding Path=FoodSales, Mode=TwoWay}">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="LostFocus">
      <i:InvokeCommandAction Command="{Binding ElementName=UserControlName, Path=DataContext.UpdateOrdersCommand}" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Classes:TextBoxEx>

答案 1 :(得分:0)

'UpdateOrdersCommand'绑定将在实际项目上查找该命令。例如。如果'ColPurchasing'是'Purchase'对象的集合,它会尝试查找Purchase.UpdateOrdersCommand

我猜你的UpdateOrdersCommand实际上在你的'ViewModel'类中

根据您的具体结构,以下内容可能有效

Command="{Binding ElementName=LayoutRoot, Path=DataContext.UpdateOrdersCommand}" />

这告诉绑定在LayoutRoot的DataContext上查找Command,在你的情况下应该是你的'ViewModel'。这适用于Silverlight和WPF,但如果您使用WPF,我认为使用RelativeSource绑定有更好的方法。

另一种选择是将“LostFocus”命令添加到Item的ViewModel(E.G. Purchase.LostFocus)并绑定到此。然后,您可以让此命令在父“ViewModel”类上调用UpdateOrders方法,或者让它引发“ViewModel”侦听的事件。

我一段时间没有发现的有用的东西是输出窗口(Debug&gt; Windows&gt; Output)。这显示了失败的绑定以及尝试解析的绑定路径。