2016-04-02 7 views
0

Ich möchte, dass mein Programm automatisch das zuletzt erstellte Objekt auswählt, wenn es der Liste hinzugefügt wird. Hier ist der aktuelle Code, der nicht funktioniert:Wie wählen Sie in TreeView programmatisch Werte aus, die Datenbindung in WPF verwenden?

public static void CreateResourceTree(TreeView selector,IEnumerable<Resource> resources,Resource onRefresh=null) 
    { 
     ActiveResources.Clear(); 
     ActiveResources.AddRange(resources.OrderByDescending(x=>x.FetchMeta("Priority").IntValue) 
     .ThenBy(x=>x.Label) 
     .ToList()); 
     selector.Items.Refresh(); 
     selector.SelectedItem=onRefresh; 
    } 

Der Code soll den Wert auf den Wert von onRefresh Leider SelectedItem als Readonly gesetzt, was zu einem Fehler führt.

Wenn ich das Problem googled, ist die einzige Lösung, die ich gefunden, ein Element programmatisch zu wählen, ist die "IsSelected" -Eigenschaft auf einem TreeViewItem, aber da dies Daten gebunden ist, verwendet oder nicht TreeViewItem Objekte. Hier

ist der XAML-Code, falls es benötigt wird:

<TreeView ItemsSource="{Binding ResourceList}" Grid.Column="0" Grid.Row="3" x:Name="ResourcesTree" SelectedItemChanged="ResourcesTree_OnSelectedItemChanged" Margin="0,4,0,0"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type xmlclass:Resource}" ItemsSource="{Binding Children}"> 
       <ContentPresenter Content="{Binding Output}" /> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

Antwort

1

Ressourcen-Wrap in einer Art Ansichtsmodell oder einfach nur eine Unterklasse mit einer IsSelected Eigenschaft erstellen.

z.B.

public class SelectableResource : Resource 
{ 
    public bool IsSelected { get; set; } 
} 

Dann einen Stil erstellen die TreeViewItem.IsSelected an Ihre neue Immobilie zu binden:

<TreeView.Resources> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="IsSelected" 
       Value="{Binding IsSelected, Mode=TwoWay}" /> 
    </Style> 
</TreeView.Resources> 

Sie nun die ausgewählten Elemente aus der Datenseite festlegen kann, anstatt zu versuchen, die Ansicht manuell zu steuern.

public static void CreateResourceTree(TreeView selector,IEnumerable<SelectableResource> resources,SelectableResource onRefresh=null) 
{ 
    ActiveResources.Clear(); 
    ActiveResources.AddRange(resources.OrderByDescending(x=>x.FetchMeta("Priority").IntValue) 
    .ThenBy(x=>x.Label) 
    .ToList()); 

    onRefresh.IsSelected = true; 
} 
Verwandte Themen