2013-02-14 1 views
1

Поскольку я переместил свой просмотр внутри элемента ItemsControl, я не могу запустить EventTrigger в моей модели ViewModel. Вот мой вводе команды декларация, которая должна стрелять 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> 

My View, где это 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 на самом деле в вашем «ViewModel» класса

В зависимости от того, как у вас есть вещи структурированная, нижеследующее может работать

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

Это говорит о связывании искать команды на DataContext LayoutRoot, который в вашем случае должен быть вашим «ViewModel». Это работает в Silverlight и, возможно, в WPF, но если вы используете WPF, я думаю, что есть лучший способ сделать это, используя привязку RelativeSource.

Другим вариантом было бы добавить команду «LostFocus» в ViewModel вашего объекта (E.G. Purchase.LostFocus) и привязать к этому. Затем вы можете вызвать эту команду при вызове метода UpdateOrders в родительском классе ViewModel или вызвать событие, которое прослушивает ViewModel.

Что-то полезное, о котором я не узнал какое-то время, было окно вывода (Debug> Windows> Output). Это показывает привязки, которые терпят неудачу, и путь связывания, который пытается быть разрешенным.

+0

Я использую Silverlight! Это не сработало. Окно вывода полезно. Теперь он показывает: Ошибка System.Windows.Data: ошибка пути BindingExpression: свойство UpdateOrdersCommand не найдено в 'WMS.WCF_WingService.Purchasing' 'WMS.WCF_WingService.Purchasing' (HashCode = 53022201). BindingExpression: Path = 'DataContext.UpdateOrdersCommand' DataItem = 'System.Windows.Controls.Grid – Colbs

+1

Попробуйте присвоить свой ItemsControl имя и затем использовать это имя для ElementName в привязке Command. Это немного хакерское, но для этого требуется минимальное количество изменений. – wdavo

+0

По-прежнему нет события. Это выглядит для моего представления для команды, а не для моей модели ViewModel. Будет ли DataItem или Find Ancestor работать? Я пробовал бесконечные варианты – Colbs

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>