Применять привязки TreeView к нерасширенным заметкам - PullRequest
1 голос
/ 28 сентября 2011

Я хочу использовать иерархический TreeView, который заполняю программно.

Мой файл XAML выглядит следующим образом:

<Window.Resources>
    <HierarchicalDataTemplate 
        DataType="{x:Type local:MyTreeViewItem}" 
        ItemsSource="{Binding Path=Children}">
        <TextBlock Text="{Binding Path=Header}"/>
    </HierarchicalDataTemplate>
</Window.Resources>


<Grid>
    <TreeView Margin="12,12,422,33" Name="treeView1" SelectedItemChanged="treeView1_SelectedItemChanged" MouseDoubleClick="treeView1_MouseDoubleClick">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
</Grid>

Проблема, с которой я столкнулся, заключается в том, чтопривязки применяются только после того, как элемент становится видимым.

Предположим, я заполняю TreeView следующим образом:

private ObservableCollection<MyTreeViewItem> m_items;
private MyTreeViewItem m_item1;
private MyTreeViewItem m_item2;

public MainWindow()
{
    InitializeComponent();
    m_items = new ObservableCollection<MyTreeViewItem>();
    m_item1 = new MyTreeViewItem(null) {Header = "Item1"};
    m_item2 = new MyTreeViewItem(null) {Header = "Item2"};
    m_item1.Children.Add(m_item2);
    m_items.Add(m_item1);
    treeView1.ItemsSource = m_items;
}

У меня также есть кнопка, которая выбирает m_item2:

private void button2_Click(object sender, RoutedEventArgs e)
{
    m_item2.IsSelected = true;
    m_item2.IsExpanded = true;
}

Теперь, если я запускаю программу и TreeView показывает только Item1 (Item2 скрыт, потому что Item1 не развернут), то нажатие кнопки не выберет m_item2.Если я разверну Item1 (таким образом делая Item2 видимым), кнопка выберет m_item2.

Изучая событие PropertyChanged на m_item2, я вижу, что оно изначально установлено в значение null, и делегат регистрируется только после того, как он становится видимым..

Это проблема для меня, потому что я хочу иметь возможность программно выбирать элемент, даже если его родитель еще не раскрыт (например, я хочу найти узел в дереве).

Полагаю, я могу программно развернуть и свернуть все узлы, но, похоже, должен быть лучший способ.Может кто-нибудь предложить решение?

1 Ответ

1 голос
/ 28 сентября 2011

Два предложения:

1) Разверните m_item1 перед выбором m_item2

2) Удерживайте выбранные параметры в модели представления (с использованием MVVM-шаблона)

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