2014-01-14 18 views
5

Ich verwende Datatemplate für SelectedItem auf Listview als:Objekt auswählen in Listview Datatemplate ausgewählt wurden

<ControlTemplate x:Key="SelectedTemplate" TargetType="ListViewItem"> 
<WrapPanel (...) BackGround="Silver"> 

</WrapPanel> 
(...) 
<Style TargetType="ListViewItem"> 
     <Style.Triggers> 
      <MultiTrigger> 
        <MultiTrigger.Conditions> 
         <Condition Property="IsSelected" Value="true" /> 
         <Condition Property="Selector.IsSelectionActive" Value="true" /> 
        </MultiTrigger.Conditions> 
        <Setter Property="Template" Value="{StaticResource SelectedTemplate}" /> 
      </MultiTrigger> 
     </Style.Triggers> 
</Style> 
</ControlTemplate> 

Auch wird Itemssource zu IObservableCollection binded. Aber ich habe einige Probleme mit der Auswahl des Elements in myListView. Was ich erreichen möchte ist, dass die Standard-Artikelvorlage einen weißen Hintergrund hat. Ausgewählter Hintergrund ist Silber. Wenn ich auf Element klicke, ändert sich der Hintergrund. Aber wenn ich es aus dem Code mache, hat listview das Element ausgewählt (hat das ausgewählt, selected index = 0, selectetitem! = Null), aber item bekommt Style von nicht ausgewählten Items. Also im Grunde möchte ich Artikel mit selectedTemplate auswählen. Ich habe versucht myListView.SelectedIndex, myLisview.SelectedItem, aber nicht wirklich funktioniert .. Irgendwelche Ideen?

Danke!

+0

Noch brauchen Hilfe. – user13657

+0

Auch - ich weiß, dass ich DataTemplate kopieren und in ausgewählte Steuerelementvorlage kopieren kann, aber ich möchte diese Lösung nicht verwenden, da jedes Mal, wenn ich eines der Elemente in listview auswähle, Methoden aus meiner Klasse abgerufen werden. Alles, was ich brauche, ist nur den gleichen Template-Wechsel Hintergrund zu Silber zu verwenden. – user13657

+0

Können Sie eine reproduzierbare Lösung erstellen? für uns zu versuchen? – BenjaminPaul

Antwort

5

Wenn ich Sie richtig verstehe, haben Sie es funktioniert, so dass wenn Sie das Element in der Liste auswählen die ausgewählte Vorlage Silber Hintergrund wird jedoch angezeigt, wenn Sie das ausgewählte Element mit Code einstellen, tut es nicht?

Ich habe ein einfaches Beispiel geschaffen, und die Änderung funktioniert, die ich machen musste, war die Bindung von SelectedItem-Eigenschaft auf Listenansicht einstellen zwei so sein ..

<ListView SelectedItem="{Binding MySelectedItem, Mode=TwoWay}"> 

Mein Beispiel verwendet jedoch Caliburn Micro Das ist nicht wichtig.

Heres Code mein Beispiel, dass es ...

Ansicht Modell Arbeiten demonstriert:

public class ShellViewModel : Screen, IShell 
{ 
    private ObservableCollection<Person> people = new ObservableCollection<Person>(); 

    public ObservableCollection<Person> People 
    { 
     get 
     { 
      return this.people; 
     } 

     set 
     { 
      this.people = value; 
      this.NotifyOfPropertyChange(() => this.People); 
     } 
    } 

    private Person selectedPerson; 

    public Person SelectedPerson 
    { 
     get 
     { 
      return this.selectedPerson; 
     } 

     set 
     { 
      this.selectedPerson = value; 
      this.NotifyOfPropertyChange(() => this.SelectedPerson); 
     } 
    } 

    public ShellViewModel() 
    { 
     var russell = new Person { Name = "Russell" }; 
     this.People.Add(new Person { Name = "Benjamin" }); 
     this.People.Add(new Person { Name = "Steve" }); 
     this.People.Add(russell); 
     this.SelectedPerson = russell; 
    } 

Ausblick:

<Window x:Class="WpfApplication5.ShellView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

<Window.Resources> 

    <Style x:Key="TextStyle" TargetType="{x:Type TextBlock}"> 
     <Style.Triggers> 
      <DataTrigger 
        Binding="{Binding 
         RelativeSource={RelativeSource 
          Mode=FindAncestor, 
          AncestorType={x:Type ListBoxItem}}, 
          Path=IsSelected}" 
        Value="True"> 
       <Setter Property="Background" Value="Red"></Setter> 
       </DataTrigger> 
     </Style.Triggers> 
    </Style> 

    <DataTemplate x:Key="MyItemTemplate"> 
     <TextBlock Text="{Binding Name}" Style="{StaticResource TextStyle}"></TextBlock> 
    </DataTemplate> 
</Window.Resources> 

<Grid Background="White"> 
    <ListView ItemsSource="{Binding People}" x:Name="People" ItemTemplate="{StaticResource MyItemTemplate}" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}"> 
    </ListView> 
</Grid> 

die S Ändern Die Eigenschaft 'selectedPerson' im Ansichtsmodell wird auch in der Ansicht angezeigt.

Hoffe, das hilft!

0

haben Sie versucht, dies in Ihrem Stil zu setzen?

<Style> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
</Style 

und dann die Vorlage ohne Trigger so voll Code wie dieser

ist
<Style TargetType="{x:Type listViewItem}"> 
<Setter Property="OverridesDefaultStyle" Value="True"/> 
<Setter Property="Template" Value="{StaticResource SelectedTemplate}" /> 
</Style> 

Grund, warum ich diese Art enthalten, da ist, wenn Sie es in Ihrem Control verwenden und den Zieltyp zu {x:Type ListViewItem} ändern eher Als targetType="ListViewItem" wird dieser Stil automatisch dem betrachteten Steuerelement zugewiesen. vielleicht, weil meine Antwort unvollständig Menschen ist nach unten meine Antwort stimmen ich nicht einmal Würde zu erklären, haben sie, na ja: hier verlängert Antwort: zusätzlich zu den oben stehenden Code Sie Eigenschaft IsSelected in Ihrer Person Klasse hinzufügen sollten welche sollte implementieren INotifyPropertyChanged und in xAML: „>

jetzt Ihrer Meinung nach Modell Sie so etwas wie dies im Konstruktor

//lsvProducts is our ListView 
view = (CollectionView) CollectionViewSource.GetDefaultView(lsvPeople.ItemsSource); 
//in the creation parameter you should put field that you want to group by :-) 
PropertyGroupDescription grouping = new PropertyGroupDescription("<FieldToGroupBy>"); 
view.GroupDescriptions.Add(grouping); 
haben sollte

zurück

<Style x:Key="GroupedView" TargetType="{x:Type GroupItem}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=chbx, Path=IsChecked}" Value="True"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate> 
          <Expander IsExpanded="False"> 
           <Expander.Header> 
            <StackPanel Orientation="Horizontal"> 
             <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="Gray" FontSize="22" VerticalAlignment="Bottom" /> 
             <TextBlock Text="{Binding ItemCount}" FontSize="16" Foreground="DimGray" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" /> 
             <TextBlock Text=" item(s)" FontSize="16" Foreground="Silver" FontStyle="Italic" VerticalAlignment="Bottom" /> 
            </StackPanel> 
           </Expander.Header> 
           <ItemsPresenter /> 
          </Expander> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 

und

<!--This goes in the same style as the prevoius sample code --> 
    <DataTrigger Binding="{Binding ElementName=chbx, Path=IsChecked}" Value="False"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <StackPanel> 
            <ItemsPresenter /> 
           </StackPanel> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 

HINWEIS Wenn Bindung an ein Element XAML gehen Sie ein in VM bool IsGrouping sagen definieren könnte und es zu, dass binden. Viel Glück :-)

+0

Um die Person, die unten gewählt ELABORATE! – XAMlMAX

Verwandte Themen