绑定ListBox的SelectedItem

时间:2016-03-27 08:42:01

标签: c# wpf mvvm binding selecteditem

嗨我有一个列表框,每行包含一个文本框和一个按钮;

点击按钮从列表框中删除行;这与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;}

我该怎么办?

2 个答案:

答案 0 :(得分:1)

您将选择传递给作为列表的删除命令,因此除非您首先将单个项目(从DataTemplate传递)包装在列表中,否则不能对两种情况使用相同的命令。 / p>

您可能应该定义一个新命令,该命令将IList作为参数(ListBox.SelectedItems的类型),然后将其项目转换为Category并单独删除。

如果您只想删除单个选定项目,则需要将绑定更改为SelectedItem,并且需要能够在现有命令中处理SelectedItemnull的情况。例如如果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>