嗨我有一个列表框,每行包含一个文本框和一个按钮;
点击按钮从列表框中删除行;这与mvvm模式一起工作
我使用命令。
这是我的xaml:
Unsafe
AtomicIntegerArray
并且在viewmodel类中我有这个命令:
Unsafe
GetAllCategories是observecollection属性;
这是我的ObjectButtonCommand代码:
<DataTemplate x:Key="CategoryTemplate">
<Border Width="400" Margin="5" BorderThickness="1" BorderBrush="SteelBlue" CornerRadius="4">
<StackPanel Grid.Row="0" Orientation="Horizontal">
<TextBlock Width="300" Margin="5" Text="{Binding Path=Name}"></TextBlock>
<Button Name="btnDeleteCategory" Width="50" Margin="5"
Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource AncestorType=ListBox}}"
CommandParameter="{Binding}" Content="-" />
</StackPanel>
</Border>
</DataTemplate>
现在每件事都没问题,当点击按钮删除行时;
现在我想要在选择一行列表框
时重复此过程我试试这段代码:
<ListBox Grid.Column="0" Grid.Row="0" Name="lstCategory"
ItemTemplate="{StaticResource CategoryTemplate}"
ItemsSource="{Binding Path=GetAllCategories}">
</ListBox>
但是我在这段代码中得到了这个错误:WhatToExecute((T)参数);
{&#34;无法转换类型&#39; System.Windows.Controls.SelectedItemCollection&#39;输入&#39; Sepand.WPFProject.Model.Model.Category&#39;。&#34;}
我该怎么办?
答案 0 :(得分:1)
您将选择传递给作为列表的删除命令,因此除非您首先将单个项目(从DataTemplate
传递)包装在列表中,否则不能对两种情况使用相同的命令。 / p>
您可能应该定义一个新命令,该命令将IList
作为参数(ListBox.SelectedItems
的类型),然后将其项目转换为Category
并单独删除。
如果您只想删除单个选定项目,则需要将绑定更改为SelectedItem
,并且需要能够在现有命令中处理SelectedItem
为null
的情况。例如如果CanExecute
尊重parameter != null
,则将InvokeCommandAction
更改为var dpLink : CADisplayLink?
dpLink = CADisplayLink(target: self, selector: "checkForStrobe")
dpLink?.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSRunLoopCommonModes)
。
答案 1 :(得分:0)
对于Listbox
,请确保SelectionMode
设置为Single
。然后更改SelectedItem
中的CommandParameter
而不是SelectedItems
。像这样:
<ListBox Grid.Column="0" Grid.Row="0" Name="lstCategory" ItemTemplate="{StaticResource CategoryTemplate}" ItemsSource="{Binding Path=GetAllCategories}" SelectionMode="Single">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding DataContext.DeleteCommand , RelativeSource={RelativeSource AncestorType=ListBox}}" CommandParameter="{Binding Path=SelectedItem,ElementName=lstCategory}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>