0

我是 xaml 的新手,下面有以下代码,我的问题是如何从 c# 代码调用 InvalidForeground 来更改复选框文本的颜色?

<ControlTemplate x:Key="ItemTemplate"
                                 TargetType="ListViewItem">
                    <StackPanel Orientation="Horizontal">                    
                        <CheckBox x:Name="CkBoxVisual">
                            <CheckBox.IsChecked>
                                <Binding Path="IsSelected"
                                         Mode="TwoWay">
                                    <Binding.RelativeSource>
                                        <RelativeSource Mode="TemplatedParent" />
                                    </Binding.RelativeSource>
                                </Binding>                                
                            </CheckBox.IsChecked>
                            <DataTrigger Binding="{Binding InvalidForeground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" Value="true">
                                <Setter TargetName="CkBoxVisual" Property="Foreground" Value="Red"/>
                            </DataTrigger>                       
                        </CheckBox>                    
                        <ContentPresenter />                    
                    </StackPanel>
                </ControlTemplate>
4

1 回答 1

0

在您的代码中,您没有调用任何内容。在其中,您希望更改依赖属性..

但是 Window 类型的控件没有名为“InvalidForeground”的依赖属性。这个触发器永远不会被触发。您的目标是什么,更改属性或收到更改通知(触发器)?


编辑:您必须遵循许多规则:

1)DataTrigger(RelativeSource)的Binding属性中引用的控件:

Binding="{Binding Path=InvalidForeground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"

必须有一个名为“InvalidForeground”的依赖属性,它可以正常工作,基于此,将不起作用:

{x:Type Window}

它的类型必须声明,才会起作用,例如:

{x:Type my:ControlName}

2) 例如,由 Trigger 或 DataTrigger 更改的属性永远不能明确说明。不管用:

<TextBlock Text="{Binding Any}" Foreground="#FFCCCCCC">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TabItem, Mode=FindAncestor}, Path=IsSelected}" Value="True">
                    <Setter Property="Foreground" Value="Black"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

将工作:

<TextBlock Text="{Binding Any}">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="#FFCCCCCC"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TabItem, Mode=FindAncestor}, Path=IsSelected}" Value="True">
                    <Setter Property="Foreground" Value="Black"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

3)使用RelativeSource检查Bindings的操作它们有一些特殊性(您应该对WPF的可视化树有所了解)。
http://msdn.microsoft.com/en-us/library/ms743599.aspx

4)您应该检查绑定是否正常工作,并且可以按照以下步骤操作:http: //www.codeproject.com/Articles/244107/Debugging-WPF-data-bindings

于 2012-11-28T00:34:51.190 回答