gpt4 book ai didi

.net - 如何将按钮关联到 ListView.SelectedItem

转载 作者:行者123 更新时间:2023-12-04 21:49:15 26 4
gpt4 key购买 nike

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

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

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

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

我的 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);
}
}

更新:
谢谢sll!

我将以下内容添加到我的 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 的引用!

最佳答案

我不确定是什么GetQueueProperties可以,但听起来你使用 SelectedFromQueue
了解执行逻辑的项目和 GUI 中的选择是次要的。

如果是这种情况,请不要使用 SelectedFromQueue但将此添加到 Button :

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

这会给你一个 Queue与按下按钮的行关联的对象为 e.ParameterSelectedFromQueue .

如果您确实需要为 GUI 设置选定项,请在 SelectedFromQueue 开头添加:
SelectedFromQueue = (e.Parameter is Queue) ? e.Parameter : null

关于.net - 如何将按钮关联到 ListView.SelectedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8053120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com