2017-01-24 6 views
0

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

<TreeView Name="treeCategories" SelectedValuePath="{Binding SelectedCategory, RelativeSource={RelativeSource AncestorType=UserControl}}"> 
     <HierarchicalDataTemplate DataType="{x:Type LocalCategories:BaseCategory}" ItemsSource="{Binding Subcategories}"> 
      <TextBlock Text="{Binding DisplayName}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

Иерархический рендеринг теперь работает нормально, но я не могу заставить дерево предварительно выбрать «текущий элемент». Текущий элемент является свойством зависимости от пользовательского элемента управления, определяется как

public BaseCategory SelectedCategory { .. } 

Я гарантировал, что это имеет значение, хотя я не уверен на 100%, когда это значение - до или после того, как дерево оказывается? Если это произойдет, то это объяснит проблему.

Я попытался:

SelectedValuePath="{Binding SelectedCategory, RelativeSource={RelativeSource AncestorType=UserControl}}" 

и

SelectedValuePath="SelectedCategory" 

, но я не могу заставить его работать.

Как сделать TreeView предварительным выбором текущего элемента? Это свойство зависимостей элемента управления пользователя, в котором определено дерево?

Редактировать

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

<TreeView.ItemContainerStyle> 
    <Style TargetType="TreeViewItem"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding SelectedCategory, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="TreeViewItem.UnderlyingObject"> 
     <Setter Property="IsSelected" Value="True" /> 
     </DataTrigger> 
    </Style.Triggers> 
    </Style> 
</TreeView.ItemContainerStyle> 

В приведенных выше утверждениях, как я могу получить доступ к лежащему в основе BaseCategory объекта TreeViewItem так, что я могу сделать сравнение и использовать триггера данных?

+0

'SelectedValuePath' служит другой цели (которые вы можете прочитать в его онлайн-документации). Вместо этого используйте 'SelectedItem'. – Clemens

+0

@Clemens, он не имеет доступного setter "_,' Mode = OneWay', похоже, не помогает. –

+0

Извините, забыли, что это свойство readonly в TreeView. [Этот вопрос] (http://stackoverflow.com/q/1000040/1136211) может помочь. – Clemens

ответ

0

Вы можете связать свойство SelectedItem TreeView с исходным свойством SelectedCategory, используя поведение.

Пожалуйста, обратитесь к следующему сообщению в блоге для примера того, как сделать это: https://blog.magnusmontin.net/2014/01/30/wpf-using-behaviours-to-bind-to-readonly-properties-in-mvvm/

<TreeView xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
      Name="treeCategories"> 
    <i:Interaction.Behaviors> 
     <local:TreeViewSelectedItemBlendBehavior 
        SelectedItem="{Binding SelectedCategory, RelativeSource={RelativeSource AncestorType=UserControl}}" /> 
    </i:Interaction.Behaviors> 
    <TreeView.Resources> 
     ... 
    </TreeView.Resources> 
</TreeView>