1

由于我将 View 移到 ItemsControl 中,因此无法在 ViewModel 中触发 EventTrigger。这是我的命令声明,应该在 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>

我的观点,这个 EventTrigger 曾经在 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>
4

2 回答 2

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>
于 2013-03-20T10:36:54.853 回答
0

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

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

根据您的结构,以下可能有效

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

这告诉绑定在 LayoutRoot 的 DataContext 上查找命令,在您的情况下应该是您的“ViewModel”。这适用于 Silverlight 并且可能适用于 WPF,但如果您使用的是 WPF,我认为使用 RelativeSource 绑定有更好的方法。

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

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

于 2013-02-14T05:57:01.350 回答