1

Since I moved my View inside an ItemsControl, I cannot get the EventTrigger to fire in my ViewModel. Here is my Commmand Declaration which should fire on LostFocus:

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

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

My View where this EvenTrigger used to fire on 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 で Command を探すようバインディングに指示します。これは、この場合は「ViewModel」である必要があります。これは Silverlight とおそらく WPF で機能しますが、WPF を使用している場合は、RelativeSource バインディングを使用するより良い方法があると思います。

もう 1 つのオプションは、「LostFocus」コマンドをアイテムの ViewModel (EG Purchase.LostFocus) に追加し、これにバインドすることです。次に、このコマンドで親の「ViewModel」クラスの UpdateOrders メソッドを呼び出すか、「ViewModel」がリッスンするイベントを発生させることができます。

しばらく知らなかった便利な機能は、出力ウィンドウ ([デバッグ] > [ウィンドウ] > [出力]) でした。これは、失敗したバインディングと、解決しようとしているバインディングのパスを示しています。

于 2013-02-14T05:57:01.350 に答える