В WPF у меня есть TreeView, ItemsSource которого привязан к статическому ресурсу. Как я могу изменить это так, чтобы дерево обновлялось при изменении элементов?

У меня есть TreeView, ItemsSource которого привязан к StaticResource, который является классом. У меня это сработало, но теперь у меня есть функция, которая обновляет самый нижний уровень TreeView с возможными разными значениями, и это обновление нужно показать немедленно. Я выполнил аналогичные задачи, такие как привязка IsChecked флажков в дереве к значению в модели, а также привязка текста текстового блока к значениям в модели.

Вот код для справки TreeView в XAML:

<!-- TREE VIEW ON LEFT HAND SIDE. LOADS TREEVIEWPARENTS, WHICH HAVE ORDER ATTRIBUTE CHILDREN -->
<DockPanel Name="test1" Margin="10,10,0,10" VerticalAlignment="Stretch" Grid.Row="3" Grid.RowSpan="6" Grid.Column="0">
    <DockPanel.Resources>
        <local:CheckBoxCommand x:Key="cbc"></local:CheckBoxCommand>
        <src:TreeViewFilter x:Key="MyList" />

        <!-- PARENTS OF THE TREEVIEW -->
        <HierarchicalDataTemplate DataType="{x:Type src:TreeViewParent}" ItemsSource="{Binding Path=OrderAttributes}">
            <TextBlock Text="{Binding Path=NameAndCount}" FontSize="24"/>
        </HierarchicalDataTemplate>

        <!-- CHILDREN OF THE PARENTS. THESE ORDER ATTRIBUTES HAVE CHILDREN OF THEIR OWN -->
        <HierarchicalDataTemplate DataType="{x:Type src:OrderAttribute}" ItemsSource="{Binding Path=OrderAttributes}">
            <StackPanel Name="test" Orientation="Horizontal" VerticalAlignment="Center">
                <CheckBox Command="{StaticResource cbc}"
                            CommandParameter="{Binding Path=NameAndParent}" Visibility="{Binding Path=CheckBoxVisible}" IsChecked="{Binding Path=isChecked}" VerticalAlignment="Center">
                </CheckBox>
                <TextBlock Text="{Binding Path=NameAndCount}" FontSize="16"/>
             </StackPanel>
        </HierarchicalDataTemplate>
    </DockPanel.Resources>

    <TreeView Name="treeView1" BorderThickness="2" ItemsSource="{Binding Source={StaticResource MyList}, NotifyOnSourceUpdated=True}" TreeViewItem.Selected="filterByBatchStatus"/>
</DockPanel>

Итак, как вы можете видеть, ItemsSource привязан к StaticResource MyList, который на самом деле является просто ключом для имени класса TreeViewFilter. Причина, по которой это работает для меня, заключается в том, что «TreeViewParents» и «OrderAttributes», содержащиеся в дереве, созданы в конструкторе класса TreeViewFilter. Но теперь я хочу иметь возможность обновлять значения в самой нижней иерархии дерева и отображать их на видном месте.

Я предполагаю, что я могу сделать это аналогично тому, как я делал другие привязки с визуальными обновлениями, используя INotifyPropertyChanged и запуская события propertyChanged или что-то в этом роде? Любые идеи?

(Кроме того, NotifyOnSourceUpdated = True в привязке - это то, с чем я просто возился из-за этой проблемы, не знаю, как это работает)


person Kevin Quiring    schedule 12.11.2012    source источник


Ответы (1)


Является ли myList ObservableCollection? Этот класс имеет встроенные уведомления.

Пример реализации взят из плохо отформатированной статьи MSDN: http://msdn.microsoft.com/en-us/library/ms748365.aspx

public class NameList : ObservableCollection<PersonName>
{
    public NameList() : base()
    {
        Add(new PersonName("Willa", "Cather"));
        Add(new PersonName("Isak", "Dinesen"));
        Add(new PersonName("Victor", "Hugo"));
        Add(new PersonName("Jules", "Verne"));
    }
  }

  public class PersonName
  {
      private string firstName;
      private string lastName;

      public PersonName(string first, string last)
      {
          this.firstName = first;
          this.lastName = last;
      }

      public string FirstName
      {
          get { return firstName; }
          set { firstName = value; }
      }

      public string LastName
      {
          get { return lastName; }
          set { lastName = value; }
      }
  }

И вот пара ссылок, которые помогут вам с концепцией использования TreeView с observableCollection: http://msdn.microsoft.com/en-us/library/dd759035(v=vs.95).aspx

Блог Майка Хиллберга

person Bill Tarbell    schedule 12.11.2012
comment
Да, это наблюдаемая коллекция, как вы продемонстрировали. Меня больше смущает то, как я пишу правильный код XAML для обновления пользовательского интерфейса при изменении ItemsSource, поскольку ItemsSource в настоящее время привязан к классу TreeViewFilter (и объекты изначально создаются в конструкторе) - person Kevin Quiring; 13.11.2012
comment
Я запутался. Вы указываете TreeView ItemsSource на новый экземпляр или изменяете ItemsSource ссылки TreeView (и как)? - person Rich; 13.11.2012
comment
Вы видели следующую ссылку? Кажется, это применимо, но я не могу сказать, не увидев кода вашего списка. stackoverflow .com / questions / 2138281 / - person Bill Tarbell; 13.11.2012
comment
Я указываю TreeView ItemsSoure на экземпляр (единственный экземпляр) класса TreeViewFilter, который создает объекты TreeView в конструкторе. Теперь у меня есть функция в этом классе TreeViewFilter, которая обновляет объекты, изначально созданные в конструкторе, и мне нужно, чтобы это новое обновление было обновлено в пользовательском интерфейсе дерева. - person Kevin Quiring; 13.11.2012