如何将按钮关联到ListView.SelectedItem

时间:2011-11-08 15:46:25

标签: .net wpf xaml listview mvvm

我有一个绑定到ObservableCollection的ListView ItemsSource。我通过MVVM添加了一个属性来跟踪ListView.SelectedItem。我的ListView中添加了一个按钮(通过GridViewColumn.CellTemplate)来创建一个按钮命令,该命令显示有关我的ObservableCollection中每个对象的数据。所以ObservableCollection(ListView第1列)中的对象列表显示在ListView中,带有相应的按钮(ListView第2列)。

守则很棒!唯一的问题是:在单击列表中的相应按钮之前,用户必须单击ListView行。 (如果用户单击按钮而不先单击ListView行,我的“SelectedFromQueue”属性会出现空引用异常。)

我想添加在单击按钮时设置ListView.SelectedItem属性的代码。因此,如果用户单击一个按钮,代码应该在执行关联的MVVM命令之前更新ListView.SelectedItem属性绑定。

有人有任何示例代码吗?谢谢你的帮助。

我的XAML:

<UserControl xmlns:local="clr-namespace:MyApp"
             x:Class="MyApp.QueueObjectList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="290" Width="320">

    <Grid Width="319">
        <GroupBox Header="Queue Class List" HorizontalAlignment="Left" Width="319" BorderBrush="Black" BorderThickness="2">
            <ListView ItemsSource="{Binding Path=QueueList}" Name="QueueListView">
                <ListView.SelectedItem>
                    <Binding Path="SelectedFromQueue" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                    </Binding>               
                </ListView.SelectedItem>
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="140" Header="Queue Name" DisplayMemberBinding="{Binding Name}" />
                        <GridViewColumn Width="179" Header="Property Information">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <Button Content="Get Property Info" Command="{Binding Path=GetQueueObjProperties}"
                                        DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}" />                      
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
        </GroupBox>
    </Grid>
</UserControl>

我的MainWindowViewModel C#代码:

private ObservableCollection<Queue> _QueueList;
private Queue _selectedFromQueue;

public ObservableCollection<Queue> QueueList
{
    get { return _QueueList; }
    set
    {
        _QueueList = value;
        RaisePropertyChanged("QueueList");
    }
}

public Queue SelectedFromQueue
{
    get { return _selectedFromQueue; }
    set
    {
        _selectedFromQueue= value;
        RaisePropertyChanged("SelectedFromQueue");
    }
}

// Constructor
public MainWindowViewModel()
{
    QueueList = new ObservableCollection<Queue>();
    _selectedFromQueue= null;
}

public ICommand GetQueueObjProperties
{
    get { return new RelayCommand(GetQueueProperties, CanGetQueueProperties); }
}

private bool CanGetQueueProperties()
{
    if (_QueueList.Count > 0)
    {
        return true;
    }
    return false;
}

private void GetQueueProperties()
{
    if (CanGetQueueProperties())
    {
        ResponseMessage.Add("Queue name: " +SelectedFromQueue.Name);
    }
}

更新: 谢谢你!

我在XAML代码中添加了以下内容:

            <ListView.Resources>
                <Style TargetType="{x:Type ListViewItem}">
                    <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
                </Style>
            </ListView.Resources>

我在后面的代码中添加了以下c#方法:

        protected void SelectCurrentItem(Object sender, KeyboardFocusChangedEventArgs e)
        {
            ListViewItem item = (ListViewItem)sender;
            item.IsSelected = true;
        }

效果很好! 再次感谢参考sll!

1 个答案:

答案 0 :(得分:1)

我不确定GetQueueProperties的作用,但听起来您使用SelectedFromQueue 来了解执行逻辑的项目,并且GUI中的选择是次要的。

如果是这种情况,请不要使用SelectedFromQueue,而是将其添加到Button

CommandParameter="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType=ListViewItem}}"

这会在Queue中为e.Parameter对象提供与{1}}中SelectedFromQueue按下的按钮行关联的对象。

如果 需要为GUI设置所选项目,请在SelectedFromQueue开头添加:

SelectedFromQueue = (e.Parameter is Queue) ? e.Parameter : null