2

コードビハインドでHierarchicalDataTemplateのを作成する必要があります。TreeView

これは私のようにXAML見えます:

<DataTemplate x:Key="DetailTemplate">
        <StackPanel Orientation="Horizontal">
            <Image Height="15" Width="15" Source="{Binding Image}" Margin="0,0,5,0"/>
            <TextBlock Text="{Binding Text}" />
        </StackPanel>
    </DataTemplate>

    <HierarchicalDataTemplate x:Key="MasterDetailTemplate" 
                              ItemsSource="{Binding SomeSource}" 
                              ItemTemplate="{StaticResource DetailTemplate}">
        <StackPanel Orientation="Horizontal">
            <Image Height="15" Width="15" Source="{Binding Image}" Margin="0,0,5,0"/>
            <TextBlock Text="{Binding Text}" />
        </StackPanel>
    </HierarchicalDataTemplate>

これは私がこれまでにc#で得たものです:

        Image image = new Image();
        image.Name = "image";
        image.Height = 15;
        image.Width = 15;

        Binding imageBinding = new Binding("Image");
        BindingOperations.SetBinding(image, Image.SourceProperty, imageBinding);

        TextBlock textBlock = new TextBlock();
        textBlock.Name = "textBlock";

        Binding textBinding = new Binding("Text");
        BindingOperations.SetBinding(textBlock, TextBlock.TextProperty, textBinding);

        StackPanel stackPanel = new StackPanel();
        stackPanel.Orientation = Orientation.Horizontal;

        stackPanel.Children.Add(image);
        stackPanel.Children.Add(textBlock);

        DataTemplate dataTemplate = new DataTemplate();
        dataTemplate.DataTemplateKey

私はで立ち往生していDataTemplateKeyます。

  • これはコードビハインドで行うことができますか?
  • ここからx:Key値を設定するにはどこに行きますか?
4

2 に答える 2

4

OKあなたの質問に対する私のコメントで、テンプレートを指定する方法の背後にあるコードを指定しました。ResourceDictionatiesに追加するときに、キーを使用してそれらを使用/参照するには、キーを使用して追加する必要があります。

   myWindow.Resources.Add("MasterDetailTemplate", dataTemplate);

代わりに、つまり、ツリービューの任意の祖先にするmyWindowことができます。myParentPanel

しかし、1つの問題があります。

キー(つまり、DataTemplate)は、設計時には存在しません。実行時に作成して追加します。

したがって、このデータテンプレートを参照している場合は、

  1. リソースディクショナリに追加された後、リソースを参照してください。

    例えば

    myWindow.Resources.Add(
         "MasterDetailTemplate",
         dataTemplate);
    
     myTreeView.ItemTemplate
       = myWindow.Resources["MasterDetailTemplate"] as HierarchicalDataTemplate;
    
  2. DynamicResourceXAMLの場合と同様に、動的に作成されたデータテンプレートを参照します。リソースディクショナリDynamicResource に事前に存在する必要がなくなります。MasterDetailTemplate

    <TreeView ItemTemplate="{DynamicResource MasterDetailTemplate}" ... >
      ....
    </TreeView>
    

お役に立てれば。

于 2011-10-20T11:41:08.500 に答える
0

XAMLのリソースを使用してこれを行います。

<DataTemplate x:Key="TreeItemTemplate" DataType="{x:Type a:DriveStatusVar}">
 <StackPanel Orientation="Horizontal">
 <TextBlock  Text="{Binding PathName, NotifyOnSourceUpdated = True, NotifyOnTargetUpdated=True, Mode=TwoWay}" FontSize="10" Style="{StaticResource textBlockStyle}" IsEnabled="True"/>
 </StackPanel>
</DataTemplate>

<HierarchicalDataTemplate x:Key="TreeModTemplate" DataType="{x:Type a:ModuleGroup}" ItemsSource="{Binding Items}">
<StackPanel Orientation="Horizontal">
<Image  Source="{StaticResource add}"  Width="15" Height="15"></Image>
<TextBlock Text="{Binding Name, NotifyOnSourceUpdated = True, NotifyOnTargetUpdated=True,  Mode=TwoWay}" Style="{StaticResource textBlockStyle}" />
<TextBlock Text=" [" Foreground="Black" />
<TextBlock Text="{Binding Items.Count}" Foreground="Black" />
<TextBlock Text=" Items]" Foreground="Black" />
</StackPanel>
</HierarchicalDataTemplate>

そして、TreeViewオブジェクトを定義および作成するコードビハインドでそれらを使用します。

TreeView tree = new TreeView(); 
HierarchicalDataTemplate hdt = (HierarchicalDataTemplate)this.Resources["TreeModTemplat"];
hdt.ItemTemplate = (DataTemplate)this.Resources["TreeItemTemplate"];                        
tree.ItemTemplate = hdt;
//add itemsource
 tree.ItemsSource = modList;

modListは、Itemsのリストを持つModuleGroupクラスのリストです。アイテムはDriveStatusVarクラスのリストです

 internal class ModuleGroup : INotifyPropertyChanged, ICloneable
{
    private bool _isSelected;
    private bool _isExpanded;
    private bool _isEdited;
    private string _name;
    private string _codesysName;
    private int _codesysId;
    private int _bits;
    private int _level;

    public  ObservableCollection<DriveStatusVar> Items { get; set; }

    public ObservableCollection<Alarm> Alarms { get; set; }

    public List<string> States { get; set; }

    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            OnPropertyChanged("IsSelected");
        }
    }

など...誰かがもっとコードが必要な場合は、教えてください!これはそれらのほんの一部です。

于 2021-01-08T11:59:02.083 に答える