2017-10-10 40 views
0

我一直在试图实现一个简单的值转换器我只是不知道为什么StringFormat没有被应用。正值变为绿色,负值变为红色,但不是得到预期结果(+15.74),最终得出:15.74747474。价值转换器不适用所需的字符串格式

我该如何得到这个工作?有人能给我一个我需要改变的想法吗?

XAML

<Window.Resources> 

    <local:PositiveConverter x:Key="PositiveConverter"/> 

    <Style TargetType="TextBlock" x:Key="NumericTextBlock"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Self}, Converter={StaticResource PositiveConverter}}" Value="True"> 
       <Setter Property="Foreground" Value="Green"/> 
       <Setter Property="Text" Value="{Binding StringFormat='({0:+0.0})'}"/> 
      </DataTrigger> 

      <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Self}, Converter={StaticResource PositiveConverter}}" Value="False"> 
       <Setter Property="Foreground" Value="Red"/> 
       <Setter Property="Text" Value="{Binding StringFormat='({0:-0.0})'}"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

</Window.Resources> 

    <Grid> 
     <StackPanel> 
      <TextBlock Text="{Binding ActualValue}" Style="{StaticResource NumericTextBlock}"/> 
     </StackPanel> 
    </Grid> 

视图模型

namespace My.ViewModel 
{ 
public class LocationViewModel : UserControl, INotifyPropertyChanged 
{ 
public MyViewModel() 
{ 
     SetActualValue(); 
} 

public DateTime mDate = DateTime.Now; 
public DateTime MDate 
{ 
get { return mDate; } 
set 
    { 
     if (value == mDate) 
     { 
      return; 
     } 
     else 
     { 
      mDate = value; 
      OnPropertyChanged("MDate"); 
      SetActualValue(); 
     } 

    } 

} 

double _actualValue; 
public double ActualValue 
{ 
    get { return _actualValue; } 
    set 
    { 
    _actualValue = value; 
    OnPropertyChanged("ActualValue"); 
    } 
} 

ValueConverter

public class PositiveConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var number = 0.0; 
     var isNumber = double.TryParse(value.ToString(), out number); 

     return isNumber && number >= 0.0; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

回答

3

设置

Text="{Binding ActualValue}" 

直接在TextBlock的比喜欢

<Setter Property="Text" Value="{Binding StringFormat='({0:+0.0})'}"/> 

因此,从二传手绑定将永远不会应用的样式二传手更高value precedence。他们也写错了,因为他们错过了物业路径ActualValue

您的方法不起作用。而应该有绑定DataTriggers像这样的视图模型属性:

<Style TargetType="TextBlock" x:Key="NumericTextBlock"> 
    <Setter Property="Text" 
      Value="{Binding ActualValue, StringFormat='({0:+0.0})'}"/> 

    <Style.Triggers> 
     <DataTrigger Binding="{Binding ActualValue, Converter={StaticResource PositiveConverter}}" 
        Value="True"> 
      <Setter Property="Foreground" Value="Green"/> 
      <Setter Property="Text" 
        Value="{Binding ActualValue, StringFormat='({0:+0.0})'}"/> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding ActualValue, Converter={StaticResource PositiveConverter}}" 
        Value="False"> 
      <Setter Property="Foreground" Value="Red"/> 
      <Setter Property="Text" 
        Value="{Binding ActualValue, StringFormat='({0:-0.0})'}"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

,并从TextBlock中删除Text="{Binding ActualValue}"

+0

谢谢克莱门斯这么清楚地解释这一点。现在我知道发生了什么。如果我从TextBlock中移除绑定,并将其保留,如下所示:()我没有任何值显示。我错过了什么? – iCosmin

相关问题