在wpf风格的setter中使用convereter

时间:2017-03-20 06:59:57

标签: wpf

我有一个转换器可以将Double.Nan转换为null。 我需要在resourcedictionary中引用它。 我将在此处包含我的代码

  <Style x:Key="LabelStyle" TargetType="{x:Type Label}" >
  <Setter Property="Content">
            <Setter.Value>
                <Binding Path="Content" RelativeSource="{RelativeSource Self}">
                    <Binding.Converter>
                        <local:NanToNullConverter/>
                    </Binding.Converter>
                </Binding>
            </Setter.Value>
        </Setter>
    </Style>

触发了这个诅咒者。但是UI中没有更新值。 绑定就像这样完成

<Label Style="{DynamicResource LabelStyle}" Content="{Binding Filters_TanksModelObject.RunDown_HeaderPressureDischargeStart ,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" ContentStringFormat="#.##" ></Label>

4 个答案:

答案 0 :(得分:1)

本地属性比样式属性更受欢迎,因此会忽略您的<Setter Property="Content">,并且仅使用Content="{Binding Filters_TanksModelObject.RunDown_HeaderPressureDischargeStart ,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"

相反,请使用

<Style x:Key="LabelStyle" TargetType="{x:Type Label}" >
    <Setter Property="Content">
        <Setter.Value>
            <Binding Path="Filters_TanksModelObject.RunDown_HeaderPressureDischargeStart" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                <Binding.Converter>
                    <local:NanToNullConverter/>
                </Binding.Converter>
            </Binding>
        </Setter.Value>
    </Setter>
</Style>

并删除直接分配。或直接使用此绑定,不要依赖于样式。

答案 1 :(得分:0)

试试这个解决方案:

1将您的转换器添加为静态资源

<UserControl.Resources>
    <local:NanToNullConverter x:Key="nanToNullCnvrt"/>
</UserControl.Resources>

2将转换器直接添加到内容属性

<Label Style="{DynamicResource LabelStyle}" Content="{Binding Filters_TanksModelObject.RunDown_HeaderPressureDischargeStart, Converter={StaticResource nanToNullCnvrt}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ContentStringFormat="#.##" ></Label>

答案 2 :(得分:0)

转换器应该应用于绑定本身,所以把它放在Style中我恐怕没有多大意义。

@ grek40的解决方案硬编码Style中的绑定路径,如果您的目的是创建一个适用于所有绑定的通用Style样式,那么Label几乎无用。

忘记尝试将转换器包含在Style中并将其应用于每个绑定:

<Application.Resources>
    <local:NanToNullConverter x:Key="NanToNullConverter" />
</Application.Resources>


<Label Style="{DynamicResource LabelStyle}" Content="{Binding Filters_TanksModelObject.RunDown_HeaderPressureDischargeStart, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, 
    Converter={StaticResource NanToNullConverter}}"  ContentStringFormat="#.##" />

另一个选项是创建一个自定义Label控件,用于在不使用转换器的情况下处理从幕后Double.Nannull的转换。

答案 3 :(得分:-1)

 <Binding Path="Content" RelativeSource="{RelativeSource Self}">

在这里使用RelativeSource,将Binding作为源并在Binding中搜索Path“Content”,并以结束错误结束。 如果您确定DataContext的类型,则可以访问Correct path和no source。

,或者

<Binding Path="Content" RelativeSource={RelativeSource AncestorType={x:Type Label}}>

如果它在模板内,

 <Binding Path="Content" RelativeSource="{RelativeSource TemplatedParent}">