gpt4 book ai didi

wpf - ListViewItem 未选择按钮单击

转载 作者:行者123 更新时间:2023-12-03 10:55:40 26 4
gpt4 key购买 nike

我有一个 ListView,其中 ListView 项目有按钮和文本 block ....

塞纳里奥:

我可以在不选择 ListView 项目的情况下单击按钮,即选择最后一个项目,然后如果我尝试单击第一个项目的按钮,则第一次未选择(在 DataGrid 中它确实选择)。

我无法使用 DataGrid,因为我在 ListView 中使用 CustomView。

如果您需要我的代码来引用问题,我会发布它..

在这方面的任何帮助都会很棒

My ListView :  

<ListView Name="lv"
Grid.Row="1"
DisplayMemberPath="Name"
IsTextSearchEnabled="True"
ItemsSource="{Binding}"
KeyboardNavigation.DirectionalNavigation="Cycle"
SelectionMode="Single"
TextSearch.TextPath="{Binding Path=Person.Name}"
View="{Binding Path=SelectedItem,
ElementName=viewComboBox}" />

我的自定义 View 的数据模板:
 <Style x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type CustomView:PlainView},
ResourceId=ImageView}"
BasedOn="{StaticResource {x:Type ListBox}}"
TargetType="{x:Type ListView}">
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value=".5" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="ItemContainerStyle" Value="{Binding (ListView.View).ItemContainerStyle, RelativeSource={RelativeSource Self}}" />
<Setter Property="ItemTemplate" Value="{Binding (ListView.View).ItemTemplate, RelativeSource={RelativeSource Self}}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border Name="bd"
Margin="{TemplateBinding Margin}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer Margin="{TemplateBinding Padding}">
<WrapPanel KeyboardNavigation.DirectionalNavigation="Cycle"
Width="{Binding ActualWidth,
RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"
MinWidth="{Binding (ListView.View).MinWidth,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ListView}}}"
IsItemsHost="True"
ItemWidth="{Binding (ListView.View).ItemWidth,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ListView}}}" Orientation="Vertical"
Height="{Binding ActualHeight,
RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"/>
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

<Style x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type CustomView:PlainView},
ResourceId=ImageViewItem}"
BasedOn="{StaticResource {x:Type ListBoxItem}}"
TargetType="{x:Type ListViewItem}">
<Setter Property="Padding" Value="3" />
<Setter Property="Margin" Value="5" />
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="2" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>

<DataTemplate x:Key="centralTile">
<StackPanel Width="80" Height="40" KeyboardNavigation.AcceptsReturn="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button x:Name="tempabc" Command="{Binding Path=Launch}" KeyboardNavigation.AcceptsReturn="True" >
<TextBlock Text="{Binding Path=Name}" FocusManager.IsFocusScope="True"></TextBlock>
</Button>
<Image Grid.Column="1" Source="Water lilies.jpg"/>
</Grid>
<TextBlock
HorizontalAlignment="Center"
FontSize="13"
Text="{Binding Path=Name}" />
</StackPanel>
</DataTemplate>
<CustomView:PlainView x:Key="plainView"
ItemTemplate="{StaticResource ResourceKey=centralTile}"
ItemWidth="100" />
<GridView x:Key="myGridView">
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button>
<TextBlock Text="{Binding Path=Name}" />
</Button>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>

最佳答案

与大多数事情一样,有很多方法可以做到这一点。这是我在一分钟内拼凑的一个...

给定以下模型:

public sealed class ItemModel
{
public string Name { get; set; }
}

我希望向用户显示它们的集合并通过按钮选择一个。这意味着我的 ViewModel 中需要三样东西:
  • ItemModel 集合
  • 用于保存当前选定实例的“SelectedItem”属性
  • 绑定(bind)到 View 中按钮的 ICommand 实现

  • 我创建了我的 ViewModel 并将这些项目添加到其中。请注意,我更喜欢让我的 ViewModels 扩展 DependencyObject 而不是弄乱 INPC。

    public sealed class ViewModel : DependencyObject
    {
    // 1. A collection of ItemModels
    public ObservableCollection<ItemModel> ItemModels { get; private set; }
    // 2. A "SelectedItem" property to hold the currently selected instance
    public static readonly DependencyProperty SelectedItemProperty =
    DependencyProperty.Register(
    "SelectedItem",
    typeof(ItemModel),
    typeof(ViewModel),
    new UIPropertyMetadata(null));
    public ItemModel SelectedItem
    {
    get { return (ItemModel)GetValue(SelectedItemProperty); }
    set { SetValue(SelectedItemProperty, value); }
    }
    // 3. An ICommand implementation to bind to the buttons in the View
    public Command SelectItem { get; private set; }
    public ViewModel()
    {
    ItemModels = new ObservableCollection<ItemModel>();
    ItemModels.Add(new ItemModel { Name = "One" });
    ItemModels.Add(new ItemModel { Name = "Two" });
    ItemModels.Add(new ItemModel { Name = "Three" });
    SelectItem = new Command
    {
    ExecuteAction = x => SelectedItem = x as ItemModel
    };
    }
    }

    最后,我将我的 UI 与基本的 ListView 结合在一起。
    <Window
    x:Class="q_7635202.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="WindowRoot">
    <ListView
    SelectedItem="{Binding SelectedItem}"
    ItemsSource="{Binding ItemModels}">
    <ListView.View>
    <GridView>
    <GridViewColumn
    DisplayMemberBinding="{Binding Name}"
    Header="Name" />
    <GridViewColumn>
    <GridViewColumn.CellTemplate>
    <DataTemplate>
    <Button
    Content="Select"
    Command="{Binding DataContext.SelectItem,
    ElementName=WindowRoot}"
    CommandParameter="{Binding}"/>
    </DataTemplate>
    </GridViewColumn.CellTemplate>
    </GridViewColumn>
    </GridView>
    </ListView.View>
    </ListView>
    </Window>

    这一切都非常简单。我忽略了 ICommand 实现,因为它很简单。

    关于wpf - ListViewItem 未选择按钮单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7635202/

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