C# 更改ItemsSource后绑定StaticResource
我是WPF的新手 我有一个简单的C# 更改ItemsSource后绑定StaticResource,c#,wpf,binding,C#,Wpf,Binding,我是WPF的新手 我有一个简单的样式为文本块设置前景和背景 我正在使用一种MVVM方法来处理oViewModel,它公开了两种颜色。 文本测试工作和测试工作工作正常。 但是文本测试不起作用不应用颜色。我认为这是因为我更改了内部列表框的项资源 为什么在这种情况下,StaticResource不起作用 <Window x:Class="app_manager.FormScripts.FormScriptsJson" xmlns="http://sc
样式
为文本块设置前景
和背景
我正在使用一种MVVM方法来处理oViewModel
,它公开了两种颜色。
文本测试工作
和测试工作
工作正常。
但是文本测试不起作用
不应用颜色。我认为这是因为我更改了内部列表框的项资源
为什么在这种情况下,StaticResource
不起作用
<Window x:Class="app_manager.FormScripts.FormScriptsJson"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:app_manager.FormScripts"
xmlns:json="clr-namespace:CtrlJson.Viewer;assembly=CtrlJson"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DataContext="{d:DesignInstance d:Type=local:CViewScriptsJson, IsDesignTimeCreatable=True}"
DataContext="{Binding RelativeSource={RelativeSource self}, Path=oViewModel}"
mc:Ignorable="d"
x:Name="_this"
Title="Scripts Results Analysis" WindowState="Maximized" WindowStyle="ToolWindow">
<Window.Resources>
<Style x:Key="StyleTxt" TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="{Binding sColorFore}" />
<Setter Property="Background" Value="{Binding sColorBack}" />
</Style>
</Window.Resources>
<DockPanel Background="{Binding sColorBack}">
<TextBlock DockPanel.Dock="Top" Style="{StaticResource StyleTxt}" Text="Test Works"/>
<Grid x:Name="GirdRoot">
<Grid.RowDefinitions>
<RowDefinition MinHeight="450"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition MinHeight="50"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<StackPanel
Grid.Row="0" Grid.Column="0" Grid.RowSpan ="3"
Margin="3"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<TextBlock DockPanel.Dock="Top" Style="{StaticResource StyleTxt}" Text="Test Works too"/>
<ListBox
Grid.Row="0" Grid.Column="0" Name="LstDataJson" ItemsSource="{Binding oLstDataDay}"
SelectedItem="{Binding Mode=TwoWay, Path=sDataDaySelected}"
IsSynchronizedWithCurrentItem="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" >
<TextBlock Text="{Binding}" Style="{StaticResource StyleTxt}"/>
<TextBlock Text="Test not work" Style="{StaticResource StyleTxt}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
</StackPanel>
</Grid>
</DockPanel>
</Window>
用于测试作品的文本框
和测试作品的都将其数据上下文设置为包含sColorFore
和sColorBack
属性的视图模型。这就是StyleTxt
可以访问它的原因。但是,列表框中的项将其数据上下文设置为LstDataJson
中对应的数据对象,该对象不包含sColorFore
和sColorBack
属性,因此绑定无法解析它们
您也可以将这些属性添加到项目中,或者创建第二个样式,该样式使用相对资源
绑定来访问其父列表框
的数据上下文,该列表框的数据上下文设置为包含颜色属性的视图模型。在数据模板中设置此样式StyleItemTxt
,而不是StyleTxt
<Style x:Key="StyleItemTxt" TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.sColorFore}"/>
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.sColorBack}"/>
</Style>
另一种选择是从视图模型中完全删除颜色属性,并将它们移动到XAML中,例如在资源字典中,以便它们可以在应用程序中重用。这种方法通常是有利的,因为它将视图关注点从业务逻辑和数据中分离出来。感谢您的回复。但是如果我在XAML资源中移动颜色,它们永远不会是动态变化的。在我的例子中,颜色取决于C代码的颜色。