2010-07-23 17 views
9

bağlanılamıyor TreeView denetimi var ve DataSource öğelerine ağaç düğümleri 'IsExpanded özelliği bağlamak istiyorum!Silverlight ağaç görünümü. "IsExpanded" özelliği

Ama bir istisna var:

System.Windows.Markup.XamlParseException occurred 
    Message=Set property '' threw an exception. 

    StackTrace: 
     at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) 
     at SilverlightTree.BSTreeView.InitializeComponent() 
     at SilverlightTree.BSTreeView..ctor() 
    InnerException: System.NotSupportedException 
     Message=Cannot set read-only property ''. 
     StackTrace: 
      at MS.Internal.XamlMemberInfo.SetValue(Object target, Object value) 
      at MS.Internal.XamlManagedRuntimeRPInvokes.SetValue(XamlTypeToken inType, XamlQualifiedObject& inObj, XamlPropertyToken inProperty, XamlQualifiedObject& inValue) 
     InnerException: 

iç istisna:

{System.NotSupportedException: Cannot set read-only property ''. 

XAML:

<Grid x:Name="LayoutRoot"> 
    <controls:TreeView Name="treeView" SelectedItemChanged="treeView_SelectedItemChanged" 
         Style="{Binding TreeViewConnectingLines}" BorderBrush="{x:Null}"> 
     <controls:TreeView.ItemTemplate> 
      <toolkit:HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
       <StackPanel Orientation="Horizontal" Background="Transparent"> 
        <toolkitDrag:ContextMenuService.ContextMenu> 
         <toolkitDrag:ContextMenu Loaded="ContextMenu_Loaded" 
               Opened="ContextMenu_Opened"/> 
        </toolkitDrag:ContextMenuService.ContextMenu> 
        <Image Source="{Binding Path=Type.Icon}" Width="20" Height="20" /> 
        <TextBlock Text="{Binding Path=FullDescription}" Height="20" 
           TextAlignment="Center" HorizontalAlignment="Center" /> 
       </StackPanel> 
      </toolkit:HierarchicalDataTemplate> 
     </controls:TreeView.ItemTemplate> 
     <controls:TreeView.ItemContainerStyle> 
      <Style TargetType="controls:TreeViewItem"> 
       <Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter> 
      </Style> 
     </controls:TreeView.ItemContainerStyle>  
    </controls:TreeView> 
</Grid> 

ve veri öğeleri:

public interface INode 
{ 
    NodeType Type { get; set; } 
    bool IsSelected { get; set; } 
    bool IsExpanded { get; set; } 
    List<INode> Children{get;set;}; 
} 
+3

SDK ve Toolkit sürümü? Bu, 'IsExpanded' özelliği ile ilgili bir şey olduğuna sizi ikna eder? Eğer 'ItemContainerStyle' öğesini kaldırırsanız istisna kaçar mı? – AnthonyWJones

+1

"ItemContainerStyle öğesini kaldırırsanız istisna ortadan kalkar mı?" Evet! istisna git! Araç Takımı: http://www.microsoft.com/silverlight/ – Evgeny

cevap

7

hızlı yolu, örneğin hem TreeView ve TreeViewItem alt sınıf şudur: subclassing yaptığınızda

public class BindableTreeViewItem : TreeViewItem 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
     var itm = new BindableTreeViewItem(); 
     itm.SetBinding(TreeViewItem.IsExpandedProperty, new Binding("IsExpanded") { Mode = BindingMode.TwoWay }); 

     return itm; 
    } 
} 

public class BindableTreeView : TreeView 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
     var itm = new BindableTreeViewItem(); 
     itm.SetBinding(TreeViewItem.IsExpandedProperty, new Binding("IsExpanded") { Mode = BindingMode.TwoWay }); 

     return itm; 
    } 
} 

Maalesef TreeView varsayılan tema kullanımını kaybedersiniz. Silverlight tema konseptinin zayıflığı budur. Böylece alternatif olarak özel bir Ekli Özellik veya bir Behavior ağacını hareket ettirebilir ve bağlantıları dışardan ayarlayabilirsiniz. Ağaç düğümleri isteğe bağlı olarak oluşturulduğundan, henüz oluşturulmamış her düğüm için bir kez Expanded etkinliğini dinlemeniz gerekir. Daha sonra, her bir çocuğa yönelik etkinlik işleyicisindeki bağlantıları, düzen geçmek.

+1

SetBinding 1 argüman almaz! – Evgeny

+2

@Evgeny ooops, benim kötü ...eksik argümanları .SetBinding (...) yöntem çağrılarına eklemek için cevabı düzenledik. – herzmeister

4

Sadece bunun mümkün olduğunu belirtmek istedim. Silverlight 5'i kullanarak SL5'e karşı derlenmiş Silverlight Toolkit'i kullanıyorum ve IsExpanded'e bağlanabilirsiniz. Stili sizden biraz farklı bir yerde tanımladım. İşte benim XAML. Eğer merak

<controls:TreeView ItemsSource="{Binding Repository.MajorClasses}" ItemTemplate="{StaticResource TreeviewMajorClassTemplate}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> 
      <controls:TreeView.Resources> 
       <Style TargetType="controls:TreeViewItem"> 
        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
       </Style> 
      </controls:TreeView.Resources> 
     </controls:TreeView> 

, bağlama SelectedItem (hala TreeView bir salt okunur özellik olduğu gibi) bir uyarı vermek yok.

Gerçekten eski bir iş parçacığı getirmek istemedim, ancak bu konu hakkında gördüğüm en son şeydi ve insanların işe yaradığını bilmesinin faydalı olacağını düşündü.

+0

Bu güncelleştirme için teşekkürler, ancak benim için işe yaramadı. Cevabımı aşağıya bakın. – Rogier

1

Malcom'u takip etmek için, bunu SL5 ile yerine ItemContainerStyle kullanarak çalıştım.

<sdk:TreeView.ItemContainerStyle> 
     <Style TargetType="sdk:TreeViewItem"> 
      <Setter Property="IsExpanded" Value="True"/> 
      <Setter Property="Visibility" Value="{Binding IsVisible, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" /> 
     </Style> 
    </sdk:TreeView.ItemContainerStyle> 
1

SL5 kullanıyorsanız, standart XAML ayarlayıcıları çalışmalıdır. Ancak, SL4 veya aşağısı kullanıyorsanız 'u here'dan kullanmanız gerekecektir. Sonra XAML'niz aşağıdaki gibi görünecektir. Aşağıda sahip olduğum şeyi dikkatli bir şekilde kopyaladığınızdan emin olun.

<sdk:TreeView.ItemContainerStyle> 
    <Style TargetType="sdk:TreeViewItem"> 
     <Setter Property="local:SetterValueBindingHelper.PropertyBinding"> 
      <Setter.Value> 
       <local:SetterValueBindingHelper> 
        <local:SetterValueBindingHelper Property="IsSelected" Binding="{Binding Mode=TwoWay, Path=IsSelected}"/> 
        <local:SetterValueBindingHelper Property="IsExpanded" Binding="{Binding Mode=TwoWay, Path=IsExpanded}"/> 
       </local:SetterValueBindingHelper> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</sdk:TreeView.ItemContainerStyle> 

sözdizimi tam olarak WPF kullanacağı gibi değil, ama o inşaat ve iyi çalışıyor!