Как добавить флажки в древовидную структуру с помощью динамического ItemsSource? - PullRequest
0 голосов
/ 19 августа 2011

Итак, я попробовал целую кучу примеров от Google, но я не могу поставить свои флажки в виде дерева .... Единственное, о чем я могу думать, это то, что это происходит из-за того, что ItemsSource моего дерева всегда меняется

Пример, который я пробовал: TreeView с флажками

наиболее заметный, HierarchicalDataTemplate:

<HierarchicalDataTemplate 
  x:Key="CheckBoxItemTemplate"
  ItemsSource="{Binding Children, Mode=OneTime}"
  >
  <StackPanel Orientation="Horizontal">
    <!-- These elements are bound to a FooViewModel object. -->
    <CheckBox
      Focusable="False" 
      IsChecked="{Binding IsChecked}" 
      VerticalAlignment="Center"
      />
    <ContentPresenter 
      Content="{Binding Name, Mode=OneTime}" 
      Margin="2,0"
      />
  </StackPanel>
</HierarchicalDataTemplate> 

, и я установил ItemTemplate моего дерева в:

ItemTemplate="{StaticResource CheckBoxItemTemplate}"

Но я не вижу флажков.Я думаю, это потому, что в этом примере данные привязаны к дочерним элементам ... но в моем примере я всегда меняю itemsSource (переходя от дерева к дереву или редактируя его, добавляя обратно в дерево и т. Д.)...

Кто-нибудь знает, как заставить это работать?

Спасибо!

* РЕДАКТИРОВАТЬ *

добавление элементов в виде дереваИсточник Я просто иду

tv_master.ItemsSource = t.TreeItems;

Где t.TreeItems - это список, который содержит узлы верхнего уровня ..

мое древовидное представление:

<my:SpecTreeView Margin="8,8,0,12" 
                         x:Name="tv_local" 
                         TreeViewItem.Selected="node_Selected" HorizontalAlignment="Left" Width="304"
                         x:FieldModifier="private" BorderBrush="Black">

Исходный класс, используемый человеком, который написал код флажка:

using System.Collections.Generic;
using System.ComponentModel;

namespace TreeViewWithCheckBoxes
{
    public class FooViewModel : INotifyPropertyChanged
    {
        #region Data

        bool? _isChecked = false;
        FooViewModel _parent;

        #endregion // Data

        #region CreateFoos

        public static List<FooViewModel> CreateFoos()
        {
            FooViewModel root = new FooViewModel("Weapons")
            {
                IsInitiallySelected = true,
                Children =
                {
                    new FooViewModel("Blades")
                    {
                        Children =
                        {
                            new FooViewModel("Dagger"),
                            new FooViewModel("Machete"),
                            new FooViewModel("Sword"),
                        }
                    },
                    new FooViewModel("Vehicles")
                    {
                        Children =
                        {
                            new FooViewModel("Apache Helicopter"),
                            new FooViewModel("Submarine"),
                            new FooViewModel("Tank"),                            
                        }
                    },
                    new FooViewModel("Guns")
                    {
                        Children =
                        {
                            new FooViewModel("AK 47"),
                            new FooViewModel("Beretta"),
                            new FooViewModel("Uzi"),
                        }
                    },
                }
            };

            root.Initialize();
            return new List<FooViewModel> { root };
        }

        FooViewModel(string name)
        {
            this.Name = name;
            this.Children = new List<FooViewModel>();
        }

        void Initialize()
        {
            foreach (FooViewModel child in this.Children)
            {
                child._parent = this;
                child.Initialize();
            }
        }

        #endregion // CreateFoos

        #region Properties

        public List<FooViewModel> Children { get; private set; }

        public bool IsInitiallySelected { get; private set; }

        public string Name { get; private set; }

        #region IsChecked

        /// <summary>
        /// Gets/sets the state of the associated UI toggle (ex. CheckBox).
        /// The return value is calculated based on the check state of all
        /// child FooViewModels.  Setting this property to true or false
        /// will set all children to the same check state, and setting it 
        /// to any value will cause the parent to verify its check state.
        /// </summary>
        public bool? IsChecked
        {
            get { return _isChecked; }
            set { this.SetIsChecked(value, true, true); }
        }

        void SetIsChecked(bool? value, bool updateChildren, bool updateParent)
        {
            if (value == _isChecked)
                return;

            _isChecked = value;

            if (updateChildren && _isChecked.HasValue)
                this.Children.ForEach(c => c.SetIsChecked(_isChecked, true, false));

            if (updateParent && _parent != null)
                _parent.VerifyCheckState();

            this.OnPropertyChanged("IsChecked");
        }

        void VerifyCheckState()
        {
            bool? state = null;
            for (int i = 0; i < this.Children.Count; ++i)
            {
                bool? current = this.Children[i].IsChecked;
                if (i == 0)
                {
                    state = current;
                }
                else if (state != current)
                {
                    state = null;
                    break;
                }
            }
            this.SetIsChecked(state, false, true);
        }

        #endregion // IsChecked

        #endregion // Properties

        #region INotifyPropertyChanged Members

        void OnPropertyChanged(string prop)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(prop));
        }

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }
}

Мой класс TNode

public class TNode : TreeViewItem{

    public int Level { get; set; }
    public Boolean IsCheckedStr { get; set; }
    public string Section { get; set; }
    public string Note { get; set; }
    public Boolean Locked { get; set; }
    public string ID { get; set; }
    public int Hierarchy { get; set; }
    public string Type { get; set; }
    public Boolean HasChildren { get; set; }
    public string TextBlock { get; set; }
    public Boolean ShowDetails { get; set; }
    public List<TNode> Dependencies { get; set; }
    public TNode(string id) {
        ID = id;
        Dependencies = new List<TNode>();
    }

Я просто хочу, чтобы флажки отображались: (

Дайте мне знать, если есть что-то еще, что вы хотели бы увидеть

1 Ответ

1 голос
/ 19 августа 2011

Редактировать: Шаблоны данных для данных, TreeViewItems или их подклассы являются не данными, шаблон будет игнорироваться .Вы должны увидеть ошибку, относящуюся к этому, в окне вывода Visual Studio (что полезно для отладки проблем привязки данных любого рода).


Ничего плохого в этом нет, вы можете опубликовать коддля классов и объявления экземпляра TreeView.

Распространенной ошибкой является отсутствие уведомляющих интерфейсов.Также: Вы связали ItemsSource самого TreeView с корневым списком элементов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...