Prism Commands - ошибка привязки при привязке к элементу списка? - PullRequest
1 голос
/ 03 апреля 2010

У меня есть ItemsControl (должен быть заменен списком), у которого его ItemsSource привязан к ObservableCollection<User>, который находится в модели представления.

Модель представления содержит несколько DelegateCommand<T> делегатов для обработки команд (например, UpdateUserCommand и RemoveUserCommand). Все работает нормально, если кнопки, связанные с этими командами, находятся вне DataTemplate элемента управления, представляющего элементы.

<ItemsControl ItemsSource="{Binding Users, Mode=TwoWay}" HorizontalContentAlignment="Stretch"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.2*"/> <ColumnDefinition Width="0.2*"/> <ColumnDefinition Width="0.2*"/> <ColumnDefinition Width="0.2*"/> <ColumnDefinition Width="0.2*"/> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" Text="{Binding UserName}"/> <PasswordBox Grid.Column="1" Password="{Binding UserPass}"/> <TextBox Grid.Column="2" Text="{Binding UserTypeId}"/> <Button Grid.Column="3" Content="Update" cal:Click.Command="{Binding UpdateUserCommand}" cal:Click.CommandParameter="{Binding}"/> <Button Grid.Column="4" Content="Remove" cal:Click.Command="{Binding RemoveUserCommand}" cal:Click.CommandParameter="{Binding}"/> </Grid><br> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>

Я пытаюсь добиться того, чтобы каждая строка - генерируемая ListView / ItemsControl - содержала кнопки для управления элементом, представляющим эту конкретную строку.


Во время выполнения панель вывода VS генерировала следующие сообщения для каждого элемента списка

System.Windows.Data Error: BindingExpression path error: 'UpdateUserCommand' property not found on 'ModuleAdmin.Services.User' 'ModuleAdmin.Services.User' (HashCode=35912612). BindingExpression: Path='UpdateUserCommand' DataItem='ModuleAdmin.Services.User' (HashCode=35912612); target element is 'System.Windows.Controls.Button' (Name=''); target property is 'Command' (type 'System.Windows.Input.ICommand')..
System.Windows.Data Error: BindingExpression path error: 'RemoveUserCommand' property not found on 'ModuleAdmin.Services.User' 'ModuleAdmin.Services.User' (HashCode=35912612). BindingExpression: Path='RemoveUserCommand' DataItem='ModuleAdmin.Services.User' (HashCode=35912612); target element is 'System.Windows.Controls.Button' (Name=''); target property is 'Command' (type 'System.Windows.Input.ICommand')..

Что подразумевает наличие ошибок привязки.

Есть ли способ сделать это правильно? или это не так?

1 Ответ

2 голосов
/ 03 апреля 2010

DataTemplate получает свой DataContext, явно установленный для элемента, который представляет шаблон. То есть DataContext вашего DataTemplate будет объектом User, а не ViewModel, который содержит ObservableCollection. Как связаны ваши команды, он ожидает найти команды в объекте User.

Вы можете явно указать источник привязки или переопределить контекст данных.

<ItemsControl HorizontalContentAlignment="Stretch" ItemsSource="{Binding Users, Mode=TwoWay}">
 <ItemsControl.ItemTemplate>
    <DataTemplate>
    ...
      <Button
         Grid.Column="3"
         cal:Click.Command="{Binding UpdateUserCommand, Source={StaticResource myVM}}"
         cal:Click.CommandParameter="{Binding}"
         Content="Update"/>
      <Button
         Grid.Column="4"
         cal:Click.Command="{Binding RemoveUserCommand, Source={StaticResource myVM}}"
         cal:Click.CommandParameter="{Binding}"
         Content="Remove"/>
    ...
    </DataTemplate>
 </ItemsControl.ItemTemplate>
</ItemsControl>
...