Я хочу назначить новый DataTrigger программным способом (в коде/не xaml) для каждого стиля TreeViewItem, как это делается в следующем xaml.WPF - TreeView - Как программно извлечь стиль TreeViewItem (выбранный стиль)
Я сделал некоторый код (под xaml), где я определил свой триггер, но «ItemContainerStyle» имеет значение null. Функция вызывается при событии инициализации окна.
У кого-нибудь есть идея, что я делаю неправильно?
EDIT
я нашел какую-то часть моей проблемы: я переехал мой стиль из раздела «Ресурс» в разделе «ItemContainerStyle», как определено ниже в примере кода. Таким образом, стиль все еще применяется, и я могу получить доступ к стилю из свойства TReeView.ItemContainerStyle в коде. Но я до сих пор не знаю, как получить выбранный стиль TreeViewItem, как цвет фона по коду?
У меня есть XAML:
<TreeView Name="TreeViewSelectScopeStudy" MinHeight="24" Margin="7"
ItemsSource="{Binding Path=TvItemRootPssTreeViewRoot.ChildsView}" Height="Auto"
VerticalAlignment="Stretch"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsHilighted}" Value="true">
<!--<Setter Property="Background" Value="SlateBlue"></Setter>-->
<Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
У меня есть этот код:
public static void EnableMultipleSelection(TreeView treeView)
{
if (!_isMultiSelectTreeViewLeftButtonHandlerRegistered)
{
EventManager.RegisterClassHandler(typeof(TreeViewItem), UIElement.MouseDownEvent,
new MouseButtonEventHandler(TreeViewMouseDownGlobal));
_isMultiSelectTreeViewLeftButtonHandlerRegistered = true;
}
DataTrigger dataTrigger = new DataTrigger();
dataTrigger.Binding = new Binding("IsHilighted");
dataTrigger.Value = true;
dataTrigger.Setters.Add(new Setter(TreeViewItem.BackgroundProperty, new SolidColorBrush(Colors.Brown)));
treeView.ItemContainerStyle.Triggers.Add(dataTrigger);
ред код:
<TreeView Name="TreeViewSelectScopeStudy" MinHeight="24" Margin="7"
ItemsSource="{Binding Path=TvItemRootPssTreeViewRoot.ChildsView}" Height="Auto"
VerticalAlignment="Stretch"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsHilighted}" Value="true">
<Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<!--<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsHilighted}" Value="true">
<Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>-->
Hi Ringer, спасибо. Я не совсем уверен, но я думаю, что все xaml должны были обрабатываться на «Инициализировано». Я стараюсь надеть «OnLoaded» без успеха. Я могу переопределить OnApplyTemplate, но я бы предпочел не делать этого, потому что хочу сохранить свой общий код. Вывод из TreeView повлияет на стандартное использование TreeView (мне придется создавать экземпляр собственного класса каждый раз, когда я хочу делать то, что я делаю сейчас). –
Привет, Эрик, OnInitialized означает, что именно элемент прошел через конструктор, поэтому все свойства были инициализированы. Это не гарантирует, что все элементы визуального дерева будут визуализированы. См. Здесь в разделе Инициализированный второй абзац. http://msdn.microsoft.com/en-us/library/ms754221.aspx –
Я только что сделал тест: using System.Diagnostics; с использованием System.Windows.Controls; пространство имен MultiSimAnalysis { \t общественного класса Test3: TreeView \t { \t \t публичного переопределение недействительными OnApplyTemplate() \t \t { \t \t \t базы.OnApplyTemplate(); \t \t \t Debug.Print (this.ItemContainerStyle.ToString()); \t \t} \t}} ... и используя TEST3 вместо TreeView в XAML, но я получаю тот же NullReferenceException. –