单击按钮时 ListViewItem 未选择

发布于 2024-12-08 02:58:26 字数 5473 浏览 0 评论 0原文

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

Senario:

我可以在不选择 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}" />

我的 CustomViews 的 DataTemplates :

 <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>

I have a ListView in which the ListView Items have button and textblock....

Senario :

I am able to click the button with out selecting the ListView Item i.e is the selection the last Item and then if i try to click the button of the first item the first time is not selected (In DataGrid it does select).

I Cannot use DataGrid as i am using CustomView in ListView.

If you need my code for reference of the problem i'll post it..

Any help in this regard would be great

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}" />

My DataTemplates for CustomViews :

 <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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

完美的未来在梦里 2024-12-15 02:58:26

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

给定以下模型:

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

我希望向用户显示它们的集合并通过按钮选择一个。这意味着我的 ViewModel 中需要三样东西:

  1. ItemModel 的集合
  2. 用于保存当前选定实例的“SelectedItem”属性
  3. 用于绑定到视图中按钮的 ICommand 实现

我创建 ViewModel 并将这些项目添加到其中。请注意,我更喜欢让我的 ViewModel 扩展 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 实现,因为它很简单。

As with most things, there are a number of ways to do this. Here's one I just threw together in a minute...

Given the following model:

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

I wish to display a collection of them to the user and select one via a button. This means I need three things in my ViewModel:

  1. A collection of ItemModels
  2. A "SelectedItem" property to hold the currently selected instance
  3. An ICommand implementation to bind to the buttons in the View

I create my ViewModel and add these items to it. Please note, I prefer making my ViewModels extend DependencyObject rather than mess with 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 
        };
    }
}

Lastly, I slap together my UI with a rudimentary 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>

Its all pretty straight forward. I'm leaving out the ICommand implementation as it is trivial.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文