2011-10-03 2 views
0

J'ai un ListView dans lequel les éléments ListView ont bouton et textblock ....ListViewItem ne pas sélectionner le bouton Cliquez

Sénario:

Je suis en mesure de cliquer sur le bouton avec en sélectionnant l'élément ListView-à-dire est la sélection du dernier élément et si j'essaie de cliquer sur le bouton du premier élément la première fois n'est pas sélectionnée (dans DataGrid il sélectionne).

Je ne peux pas utiliser DataGrid car j'utilise CustomView dans ListView.

Si vous avez besoin de mon code de référence du problème que je vais le poster ..

Toute aide à cet égard serait grand

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

Mes DataTemplates pour 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> 
+0

Veuillez partager un extrait de code expliquant votre implémentation/problème. –

+0

Sure ill postez-le – Ankesh

+0

@mzabsky merci pour le gr8, mais quand vous éditez, n'oubliez pas de donner un peu d'amour au titre. – Will

Répondre

3

Comme pour la plupart des choses, il y a plusieurs façons de le faire. Voilà que je viens de jeter ensemble dans une minute ...

Compte tenu du modèle suivant:

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

Je souhaite afficher une collection d'entre eux à l'utilisateur et sélectionnez l'une via un bouton. Cela signifie que je besoin de trois choses dans mon ViewModel:

  1. Une collection de ItemModels
  2. A « SelectedItem » propriété de tenir le cas actuellement sélectionné
  3. Une implémentation ICommand de se lier aux boutons dans la vue

Je crée mon ViewModel et y ajoute ces éléments. Veuillez noter que je préfère que mes ViewModels étendent DependencyObject plutôt que de jouer avec 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 
     }; 
    } 
} 

Enfin, je claque ensemble mon interface utilisateur avec un ListView rudimentaire.

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

Tout est assez simple. Je laisse de côté l'implémentation ICommand car c'est trivial.

+0

Cela signifie que dans l'implémentation ICommand, la propriété "SelectedItem" sera définie par l'objet CommandParameter. Vous avez aussi dit que vous utilisiez DependencyObject de INPC il n'y a aucun avantage à utiliser cela dans MVVM – Ankesh

+0

Opps vous l'avez déjà fait dans l'initialiseur de commande ... my Bad – Ankesh

+0

@ adcool2007: Les DP sont la liaison la plus rapide dans WPF, et je les trouve beaucoup plus facile à traiter que l'INPC. C'est une chose personnelle. – Will

Questions connexes