2013-02-14 26 views
1

因爲我在一個ItemsControl中移動了View,所以無法在ViewModel中觸發EventTrigger。這裏是我的條命令宣言應該開槍引發LostFocus:ItemsControl + Textbox + MVVM + EventTrigger Not Firing

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> 

回答

0

的「UpdateOrdersCommand '綁定將在實際項目上查找該命令。例如。如果「ColPurchasing」是「購買」對象的集合,它會試圖找到Purchase.UpdateOrdersCommand

我猜你的UpdateOrdersCommand實際上是在你的「視圖模型」類

取決於你如何有事情結構化的,下面可能工作

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

這告訴結合查找命令在LayoutRoot的DataContext的,而你的情況應該是你的「視圖模型」。這可以在Silverlight中使用,也可以在WPF中使用,但是如果您使用的是WPF,我認爲有一種更好的方法可以使用RelativeSource綁定來完成。

另一種選擇是將'LostFocus'命令添加到您的項目的ViewModel(E.G. Purchase.LostFocus)並綁定到此。然後,您可以使用此命令在父'ViewModel'類上調用UpdateOrders方法,或者讓它引發'ViewModel'偵聽的事件。

一段時間我沒有發現的東西是Output窗口(Debug> Windows> Output)。這顯示失敗的綁定和試圖解決的綁定的路徑。

+0

我使用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 – Colbs 2013-02-14 06:16:52

+1

嘗試給你的ItemsControl一個名稱,然後在命令綁定中使用該名稱作爲ElementName。這有點冒險,但它需要對當前代碼進行最少量的更改。 – wdavo 2013-02-14 06:25:12

+0

仍然沒有事件發射。它正在尋找我的視圖的命令,而不是我的ViewModel ..數據項或查找祖先的工作?我試過無盡的變化 – Colbs 2013-02-14 06:39:18

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>