2016-04-02 47 views
0

Programım, listeye eklendiğinde en son oluşturulan nesneyi otomatik olarak seçmesini istiyorum.WPF'de veri bağlamayı kullanan TreeView'daki değerleri programlı olarak nasıl seçersiniz?

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

kod hatayla sonuçlanır salt okunur olarak onRefresh Maalesef SelectedItem değerinin değerini ayarlamak anlamına gelir: Burada çalışmıyor geçerli kod var.

Bu sorunu giderdiğimde, bir öğeyi programlı olarak seçmek için bulduğum tek çözüm, bir TreeViewItem üzerinde "IsSelected" özelliğini kullanmaktır; ancak bu, veriye bağlı olduğundan TreeViewItem nesnelerini kullanmaz veya tanımlamaz. İşte

durumunda ihtiyaç duyulduğunda, XAML kod şudur:

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

cevap

1

ViewModel çeşit daki Kaynak sarın ya da sadece bir IsSelected özelliğe sahip bir alt sınıf oluşturmak.

örn.

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

Ardından yeni mülke TreeViewItem.IsSelected bağlamak için bir stil oluşturmak:

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

Artık ziyade elle görünümü kontrol tutmak yerine, veri tarafında seçilen öğeleri ayarlayabilirsiniz.

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; 
} 
İlgili konular