如何获取Listview项目在Relaycommand中单击值

时间:2013-05-22 05:50:47

标签: c# mvvm windows-8 windows-store-apps winrt-xaml

嗨我正在使用MVVM模式在windows商店应用程序中工作,并且我在catch命令中捕获listview itemclick值时遇到了一些问题。现在我得到了所选的项目值。但是不知道如何获得itemclickValue。在这里,我附上了我的代码。

XAML

 <ListView x:Name="lstItem" ItemTemplate="{StaticResource ItemTemplate}"  ItemsSource="{Binding ItemList}" Padding="130,0,0,0" SelectedItem="{Binding SelectedItem,Mode=TwoWay}">
            <Triggers:Interactions.Triggers>
                <Triggers:EventTrigger EventName="SelectionChanged">
                    <Triggers:InvokeCommandAction Command="{Binding SelectedItemCommand}" CommandParameter="{Binding SelectedItem,Mode=TwoWay}"/>
                </Triggers:EventTrigger>
            </Triggers:Interactions.Triggers>
        </ListView>

ViewModel代码

private Item _selectedItem;
    public Item SelectedItem { get { return _selectedItem; } set { _selectedItem = value; NotifyPropertyChanged("SelectedTrends"); } }



private RelayCommand<Item> _selectedItemCommand;
    public RelayCommand<Item> SelectedItemCommand
    {
        get
        {
            return this._selectedItemCommand
                ?? (this._selectedItemCommand= new RelayCommand<Item>(item=>
                {
                    MessageDialog messagedialog = new MessageDialog(item.Name,"Test");
                    messagedialog.ShowAsync();
                }));
        }

    }

2 个答案:

答案 0 :(得分:7)

这里有一些冗余:

选项1:备用CommandParameter:

private Item _selectedItem;
public Item SelectedItem 
{ 
     get { return _selectedItem; } 
     set { _selectedItem = value; NotifyPropertyChanged("SelectedTrends"); } 
}



private RelayCommand _selectedItemCommand;
public RelayCommand SelectedItemCommand
{
    get
    {
        return this._selectedItemCommand
            ?? (this._selectedItemCommand= new RelayCommand(() =>
            {
                MessageDialog messagedialog = new MessageDialog(selectedItem.Name,"Test");
                messagedialog.ShowAsync();
            }));
    }

}

和XAML:

<ListView x:Name="lstItem" ItemTemplate="{StaticResource ItemTemplate}"  ItemsSource="{Binding ItemList}" SelectedItem="{Binding SelectedItem,Mode=TwoWay}" Padding="130,0,0,0">
    <Triggers:Interactions.Triggers>
        <Triggers:EventTrigger EventName="SelectionChanged">
            <Triggers:InvokeCommandAction Command="{Binding SelectedItemCommand}" />
        </Triggers:EventTrigger>
     </Triggers:Interactions.Triggers>
 </ListView>

选项2:备用SelectedItem绑定:

<ListView x:Name="lstItem" ItemTemplate="{StaticResource ItemTemplate}"  ItemsSource="{Binding ItemList}" Padding="130,0,0,0">
    <Triggers:Interactions.Triggers>
        <Triggers:EventTrigger EventName="SelectionChanged">
            <Triggers:InvokeCommandAction Command="{Binding SelectedItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=lstItem}"/>
        </Triggers:EventTrigger>
     </Triggers:Interactions.Triggers>
 </ListView>

并从ViewModel中删除SelectedItem属性,除非您需要其他内容。

修改

如果要处理项目上的click事件,则需要将行为移动到ItemTemplate DataTemplate父控件,例如放置控件的网格。这使您可以处理项目上的单击事件。

答案 1 :(得分:0)

为了解决这个问题,我评估了如果有Null引用的setter属性。然后它工作正常,事件不再被抛出选择其他元素。

<ListView Name="lstView" ItemsSource="{Binding Path=SimResults}" >
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding SelectedItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=lstView}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="FileUniqueID" Width="Auto" DisplayMemberBinding="{Binding Path=FileUniqueID}" />
                <GridViewColumn Header="XML" Width="Auto" DisplayMemberBinding="{Binding Path=XML}" />
                <GridViewColumn Header="Request" Width="Auto" HeaderStringFormat="" DisplayMemberBinding="{Binding Path=RequestShort}" />
                <GridViewColumn Header="RequestDate" Width="Auto" DisplayMemberBinding="{Binding Path=RequestDate}" />
                <GridViewColumn Header="Response" Width="Auto" DisplayMemberBinding="{Binding Path=ResponseShort}" />
                <GridViewColumn Header="ResponseDate" Width="Auto" DisplayMemberBinding="{Binding Path=ResponseDate}" />
                <GridViewColumn Header="ResendCounter" Width="Auto" DisplayMemberBinding="{Binding Path=ResendCounter}" />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>