多值绑定文本块 DataTrigger 未触发

Posted

技术标签:

【中文标题】多值绑定文本块 DataTrigger 未触发【英文标题】:Multivalue Bound Textblock DataTrigger not firing 【发布时间】:2015-10-15 14:13:31 【问题描述】:

所以我试图将一个 TextBlock 绑定到我的 Viewmodel 上的多个值(枚举和字符串的混合)。我有一个 DataTrigger,supposed 在转换器返回时文本为空时触发。但事实并非如此!起初,我认为我的风格没有占据上风(因此改变了风格上的背景以显示它确实如此)。反正这里是代码

XAML

<TextBlock x:Name="MyTextBlock" Grid.Column="2" Grid.ColumnSpan="3"  VerticalAlignment="Center" DataContext="StaticResource ViewModelLocator"
                   Margin="Binding RelativeSource=RelativeSource Self, Path=(params:General.BoldPadding), Mode=OneWay">

            <TextBlock.Text>
                <MultiBinding Converter="StaticResource GeneralMultiStringDisplayConverter">
                    <Binding Path="RatesViewModel.Instrument.Currency" NotifyOnSourceUpdated="True" UpdateSourceTrigger="PropertyChanged"/>
                    <Binding Path="RatesViewModel.Instrument.Underlying" NotifyOnSourceUpdated="True" UpdateSourceTrigger="PropertyChanged"/>
                    <Binding Path="RatesViewModel.Instrument.ProductType" NotifyOnSourceUpdated="True" UpdateSourceTrigger="PropertyChanged"/>
                </MultiBinding>
            </TextBlock.Text>
            <TextBlock.Resources>
                <Style TargetType="x:Type TextBlock" BasedOn="StaticResource HeaderTextStyle">
                    <Setter Property="Background" Value="Blue"/>
                    <Style.Triggers>
                        <DataTrigger Binding="Binding ElementName=MyTextBlock, Path=Text" Value="x:Null"> <!--THIS SHOULD FIRE-->
                            <Setter Property="Text" Value="ThisShouldFireOnStart"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Resources>
        </TextBlock>

转换器如下:

class GeneralMultiStringDisplayConverter:IMultiValueConverter


    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        var AS = DependencyProperty.UnsetValue;    
        if (values[0] != AS )
        
            int count = values.Count();
            string result = string.Empty;
            for (int i = 0; i < count - 1; ++i)
            
                try
                
                    var A = Enum.GetName((values[i].GetType()), values[i]);
                    result = String.Format("01.", result, A);
                
                catch (Exception ex)
                

                    result = String.Format("01.", result, values[i]);
                
            
            result = String.Format("01", result, values[count - 1]);
            return result;
        
        return null;
    

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    
        return null;
        //TODO:
    

我已采取的调试步骤

    `<Setter Property="Text" Value="ABC"/>
         <Style.Triggers>
<DataTrigger Binding="Binding ElementName=MyTextBlock, Path=Text" Value="ABC"> 
<Setter Property="Text" Value="ThisShouldFireOnStart"/>
 </DataTrigger>
   </Style.Triggers>
                           `
    向 Styles DataTrigger 绑定添加了一个转换器。它总是将 "" 作为参数,并且由于某种原因不为空。将触发器值设置为 "" 不起作用。

    在样式中添加了一个默认的文本属性,并尝试根据它更改值。 (见上例)

    如果能帮我解决这个问题,我将不胜感激 谢谢!

【问题讨论】:

【参考方案1】:

您不能使用样式中的 DataTrigger 覆盖这些本地绑定。 见Why doesn’t my WPF Trigger work?

如果您只需要在绑定为空时显示一个字符串,请使用TargetNullValue="MyNullValueString"

也许您需要在转换器中使用if(value[0] != null) 条件来识别未设置的属性。由于我没有您的 RatesViewModel 的任何详细信息,我无法确定。

<MultiBinding Converter="StaticResource GeneralMultiStringDisplayConverter" TargetNullValue="ThisIsNull">
    <Binding Path="RatesViewModel.Instrument.Currency" NotifyOnSourceUpdated="True" UpdateSourceTrigger="PropertyChanged"/>
    <Binding Path="RatesViewModel.Instrument.Underlying" NotifyOnSourceUpdated="True" UpdateSourceTrigger="PropertyChanged"/>
    <Binding Path="RatesViewModel.Instrument.ProductType" NotifyOnSourceUpdated="True" UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding>

【讨论】:

Null 是 DP 和 Dp 的有效值。Unset 是在 Dp 上没有值时设置的值。这篇 MSDN ((msdn.microsoft.com/en-us/library/…)) 文章解释了不同之处。指向您博客的链接很有帮助,TargetNullValue 起到了作用。我不得不将我的绑定移动到样式中并使用这个技巧!标记为正确谢谢!

以上是关于多值绑定文本块 DataTrigger 未触发的主要内容,如果未能解决你的问题,请参考以下文章

消除重复的 DataTrigger 逻辑

WPF 多值绑定(MultiBinding)与多属性触发器(MultiTrigger)与多数据触发器(MultiDataTrigger)

DataTrigger

DataTrigger

绑定属性上的 DataTrigger

使用 DataGrid 内的 DataTrigger 绑定到 DataRowView