Почему в WPF мой стиль в Generic.xaml не применяется к моему пользовательскому элементу управления?

В WPF у меня есть настраиваемый элемент управления, унаследованный от TreeView. Код следующий ...

public class CustomTRV : TreeView
{
    static CustomTRV()
    {
        //Removed this because I want the default TreeView look.
        //......CustomTRV.DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTRV), new FrameworkPropertyMetadata(typeof(CustomTRV)));
    }

    public void Connect(string entityHierarchyToken)
    {
        //build viewModel classes... 
        this.ItemsSource = new List<ViewModel>()
        {
            new ViewModel() { TextValue = "aaaa" },
            new ViewModel() { TextValue = "bbb" },
            new ViewModel() { TextValue = "ccc" },
            new ViewModel() { TextValue = "ddd" },
            new ViewModel() { TextValue = "eee" },
        };
    }
}

Содержимое Generic.xaml выглядит следующим образом ...

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfTestCustomControl">

    <HierarchicalDataTemplate DataType="{x:Type local:ViewModel}">
        <TextBlock Foreground="Blue" Text="{Binding Path=TextValue}"></TextBlock>
    </HierarchicalDataTemplate>

    <Style TargetType="{x:Type local:CustomTRV}">
        <Setter Property="ItemContainerStyle">
            <Setter.Value>

                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                    <Setter Property="FontWeight" Value="Bold" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="FontWeight" Value="Normal" />
                        </Trigger>
                    </Style.Triggers>
                </Style>

            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

Я думал, что код Generic.xaml должен быть применен к моему элементу управления, и поэтому должно быть установлено значение свойства ItemContainer. Но похоже, что ItemContainerStyle вообще не имеет никакого эффекта.

ПРИМЕЧАНИЕ. HierarchicalDataTemplate из Generic.xaml ДЕЙСТВИТЕЛЬНО работает, поэтому файл интерпретируется.

Любые идеи?


person willem    schedule 04.11.2009    source источник
comment
Если вы делаете MVVM, вы смешиваете свои модели и модели просмотра.   -  person    schedule 04.11.2009
comment
Я думаю, что делаю простой ViewModel, как указано в этой статье CodeProject - codeproject.com/KB /WPF/TreeViewWithViewModel.aspx Так что «ViewModel» может сбивать с толку мой класс данных. Это должно быть что-то вроде MyDataObjectToDisplay.   -  person willem    schedule 04.11.2009


Ответы (1)


Если оставить в стороне вопросы MVVM и настраиваемого элемента управления, проблема в том, что вы закомментировали строку, которая связывает стиль с вашим настраиваемым элементом управления:

//CustomTRV.DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTRV), new FrameworkPropertyMetadata(typeof(CustomTRV)));

Следовательно, ваш элемент управления будет иметь стандартный стиль для TreeViews.

person Kent Boogaart    schedule 04.11.2009
comment
Имеет ли это значение? Поскольку я просто переопределяю ItemContainerStyle, а не шаблон? - person willem; 04.11.2009
comment
Да, поскольку ItemContainerStyle содержится в Style, который применяется к CustomTRV. Стиль для CustomTRV никогда не будет применяться, потому что он не был связан с классом CustomTRV. Попробуйте раскомментировать строку. - person Kent Boogaart; 04.11.2009
comment
Фантастика. Это трюк. Я немного боролся, потому что мне нужно было убедиться, что мой стиль основан на обычном стиле TreeView. Ваш совет в дополнение к этому сработал: ‹Style TargetType = {x: Type local: CustomTRV} BasedOn = {StaticResource {x: Type TreeView}}› ... Спасибо, Кент! - person willem; 05.11.2009