SORU
16 HAZİRAN 2009, Salı


Veri WPF bir ağaç görünümü öğeye bağlama

Nasıl WPF-ağaç görünümü Seçili öğeyi alabilir miyim? Bu büyüyü yapmak için istiyorum çünkü XAML bunu yapmak istiyorum.

SelectedItem ama görünüşe göre öyle olduğunu düşünebilirsinizyoksalt okunur ve bu nedenle kullanılamaz.

Bu yapmak istediğim şey:

<TreeView ItemsSource="{Binding Path=Model.Clusters}" 
    		ItemTemplate="{StaticResource ClusterTemplate}"
    		SelectedItem="{Binding Path=Model.SelectedCluster}" />

Benim Model bağlama özelliği SelectedItem istiyorum.

Ama bu bana hata veriyor:

'Selectedıtem' özelliği salt okunur ve hiçbir şekilde biçimlendirme. itibaren

Düzenleme: Tamam, bu çözdüm bu şekilde

<TreeView
    	  ItemsSource="{Binding Path=Model.Clusters}" 
    	  ItemTemplate="{StaticResource HoofdCLusterTemplate}"
    	  SelectedItemChanged="TreeView_OnSelectedItemChanged" />

ve benim xaml ve codebehindfile

private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    Model.SelectedCluster = (Cluster)e.NewValue;
}

CEVAP
25 ŞUBAT 2011, Cuma


Bu cevabı kabul oldu farkındayım, ama bu arada sorunu çözmek için koydum. Ağaç sınıfı için gerek kalmadan Delta çözümü için, ama benzer bir fikir kullanır:

public class BindableSelectedItemBehavior : Behavior<TreeView>
{
    #region SelectedItem Property

    public object SelectedItem
    {
        get { return (object)GetValue(SelectedItemProperty); }
        set { SetValue(SelectedItemProperty, value); }
    }

    public static readonly DependencyProperty SelectedItemProperty =
        DependencyProperty.Register("SelectedItem", typeof(object), typeof(BindableSelectedItemBehavior), new UIPropertyMetadata(null, OnSelectedItemChanged));

    private static void OnSelectedItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var item = e.NewValue as TreeViewItem;
        if (item != null)
        {
            item.SetValue(TreeViewItem.IsSelectedProperty, true);
        }
    }

    #endregion

    protected override void OnAttached()
    {
        base.OnAttached();

        this.AssociatedObject.SelectedItemChanged  = OnTreeViewSelectedItemChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        if (this.AssociatedObject != null)
        {
            this.AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
        }
    }

    private void OnTreeViewSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        this.SelectedItem = e.NewValue;
    }
}

Daha sonra XAML bu kullanabilirsiniz:

<TreeView>
    <e:Interaction.Behaviors>
        <behaviours:BindableSelectedItemBehavior SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
    </e:Interaction.Behaviors>
</TreeView>

Umarım birileri yardımcı olacaktır!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • engineerguy

    engineerguy

    10 Ocak 2010
  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007
  • hytchme

    hytchme

    9 Mart 2014