2015-04-24 36 views
0

我有一个Label我绑定DateTimestring使用MultiBinding。 对于DateTime我想检查.MinValue使用DataTrigger使用DataTrigger更改TextBlock的样式,并结合MultiBinding

这是我当前的代码,我改变的TextBlockText

<TextBlock > 
    <TextBlock.Text> 
      <MultiBinding StringFormat="{}{0} {1:dd.MM.yyyy} {2:HH:mm:ss}"> 
      <Binding Path="myString" /> 
      <Binding Path="myDate" /> 
      <Binding Path="myDate" /> 
      </MultiBinding> 
    </TextBlock.Text> 
    </TextBlock> 

这是我要如何更改生效日期“ - ”如果它等于DateTime.MinValue

<TextBlock.Style> 
    <Style TargetType="TextBlock"> 
    <Setter Property="Text" Value="{Binding Path=MyDate, StringFormat=d}" /> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding MyDate}" Value="{x:Static sys:DateTime.MinValue}"> 
      <Setter Property="Text" Value="-" /> 
     </DataTrigger> 
    </Style.Triggers> 
    </Style> 
</TextBlock.Style> 

不幸的是我对XAML不太熟悉。我很乐意看到这两个组合。因此,如果myDate等于DateTime.MinDate,TextBoxText将读取-,如果在myDate中存在实际DateTime,则使用我提供的StringFormat。谢谢你的帮助!

+0

您可以使用'MultiValueConverter'来产生最终的期望输出并跳过'Trigger'。 –

+0

你的意思是,把逻辑代码? – tzippy

+0

是的,确切地说。你创建一个从'IMultiValueConverter'派生的类,在它的'Convert'方法中,你将有一个按照你的'Binding'顺序的对象数组,然后你可以尝试将其转换为基础类型并转换为你需要的类型。例如。如果它是'MinValue'返回“ - ”而不是'ToString()'格式的日期/时间。 –

回答

1

或者,您可以使用MultivalueConverter作为您的TextBlock

这是一个粗略的例子:

public class MyConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string retVal = "-"; 

     foreach(var currentValue in values) 
     { 
      if(currentValue is string) 
      { 
       retVal = dosomething; 
       //break here if you satisfied; 
      } 
      else if(currentValue is DateTime) 
      { 
       DateTime theVal = (DateTime)currentValue; 
       if(theVal == DateTime.MinValue) 
       { 
        retVal = "-"; 
       } 
       else 
       { 
        retVal = theVal.ToString("Format here..."); 
       } 
       //break if satisfied 
      } 

     } 
     return retVal; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return new object[] { Binding.DoNothing, Binding.DoNothing }; 
    } 
} 

这里是对应XAML:

<Window.Resources> 
    <yourNamespace:MyConverter x:Key="MultiValueConverter" /> 
</Window.Resources> 

<TextBlock.Text> 
    <MultiBinding Converter="{StaticResource MultiValueConverter}"> 
     <Binding Path="myString" /> 
     <Binding Path="myDate" /> 
     <Binding Path="myDate" /> 
    </MultiBinding> 
</TextBlock.Text> 

把期望的逻辑到转换方法。 values数组中值的顺序与您的绑定顺序相同。这样,您可以根据输入将所需结果拼接在一起。