Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改ItemsSource后绑定StaticResource_C#_Wpf_Binding - Fatal编程技术网

C# 更改ItemsSource后绑定StaticResource

C# 更改ItemsSource后绑定StaticResource,c#,wpf,binding,C#,Wpf,Binding,我是WPF的新手 我有一个简单的样式为文本块设置前景和背景 我正在使用一种MVVM方法来处理oViewModel,它公开了两种颜色。 文本测试工作和测试工作工作正常。 但是文本测试不起作用不应用颜色。我认为这是因为我更改了内部列表框的项资源 为什么在这种情况下,StaticResource不起作用 <Window x:Class="app_manager.FormScripts.FormScriptsJson" xmlns="http://sc

我是WPF的新手

我有一个简单的
样式
文本块设置
前景
背景

我正在使用一种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代码的颜色。