2015-04-24 35 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數組中值的順序與您的綁定順序相同。這樣,您可以根據輸入將所需結果拼接在一起。