【问题标题】:ItemsControl + Textbox + MVVM + EventTrigger Not FiringItemsControl + Textbox + MVVM + EventTrigger 未触发
【发布时间】:2013-02-14 04:53:35
【问题描述】:

由于我将 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>

【问题讨论】:

    标签: silverlight xaml mvvm eventtrigger


    【解决方案1】:

    你可以这样绑定元素:

    <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>
    

    【讨论】:

      【解决方案2】:

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

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

      根据您的结构,以下可能会起作用

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

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

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

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

      【讨论】:

      • 我正在使用 Silverlight!那没有用。输出窗口是一个有用的提示。现在显示:System.Windows.Data 错误:BindingExpression 路径错误:在“WMS.WCF_WingService.Purchasing”“WMS.WCF_WingService.Purchasing”(HashCode=53022201)上找不到“UpdateOrdersCommand”属性。 BindingExpression: Path='DataContext.UpdateOrdersCommand' DataItem='System.Windows.Controls.Grid
      • 尝试为您的 ItemsControl 命名,然后在 Command 绑定中使用该名称作为 ElementName。这有点骇人听闻,但它需要对您当前的代码进行最少的更改。
      • 仍然没有触发事件。它正在查看我的命令视图而不是我的视图模型.. DataItem 或 Find Ancestor 是否有效?我尝试了无穷无尽的变化
      • 如果您使用 Silverlight 5 msdn.microsoft.com/en-us/library/…,则具有 AncestorType 的相对源应该可以工作
      • 我还是想不通。您发布的链接是相似的,但不完全是答案。 InvokeCommandAction 不想触发。
      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多