2016-05-05 20 views
1

Ich habe den folgenden Code ein "WaterMark"TextBlock auf jede wpf Kontrolle für die Platzierung:Erstellen ein Wasserzeichen Templat texblock wpf

<TextBlock Text="Some Text" IsHitTestVisible="False" Foreground="Gray" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Normal"> 
    <TextBlock.Style> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Visibility" Value="Hidden"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=FromFrameComboBox, Path=SelectedItem}" Value="{x:Null}"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TextBlock.Style> 
</TextBlock> 

Um diese Linien für jede Steuer ich bind will diese TextBlock zu verhindern duplizieren, ich möchten ein UserControl von ihm zu schaffen und es wie folgt verwendet werden:

<ComboBox x:Name="FromFrameComboBox" Grid.Row="0" Grid.Column="1" ItemsSource="{Binding OrDataContainers.ObjectsCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalContentAlignment="Center" 
           VerticalContentAlignment="Center" VerticalAlignment="Center" SelectedItem="{Binding OrDataContainers.SelectedObject, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="0,5,0,0"/> 
<Wpf:WatermarkTextBlock x:Name="FromFrameComboBoxText" Text="Select Frame Number" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"/> 

(ich die TextBlock Definition in einer inkludiertengesetzt habenDatei, und es sieht wie folgt aus:

<TextBlock x:Class="Wpf.WatermarkTextBlock" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     IsHitTestVisible="False" Foreground="Gray" FontWeight="Normal"> 
<TextBlock.Style> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Visibility" Value="Hidden"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=AvailableFrames, Path=SelectedItem}" Value="{x:Null}"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</TextBlock.Style> 

Die Sache ist die, dass die DataTrigger an eine Steuer binded I haben derzeit in der Anwendung Ich entwickle: AvailableFrames, und wenn ich möchten diese dll in einer anderen Anwendung wiederverwenden, muss ich die DataTrigger Bindung ändern.

Kann so etwas getan werden?

Antwort

1

In diesem konkreten Fall NullToVisibilityConverter wird eine einfachere Lösung

public class NullToVisibilityConverter : MarkupExtension, IValueConverter 
{ 
    public Visibility NullValue { get; set; } 
    public Visibility NotNullValue { get; set; } 
    public NullToVisibilityConverter() 
    { 
     NullValue = Visibility.Collapsed; 
     NotNullValue = Visibility.Visible; 
    } 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
      return NullValue; 
     return NotNullValue; 
    } 


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

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
} 

Verwendungsbeispiel sein:

<ComboBox x:Name="FromFrameComboBox"/> 
<TextBlock Visibility="{Binding SelectedItem, ElementName=FromFrameComboBox, 
           Converter={local:NullToVisibilityConverter NullValue=Visible, NotNullValue=Hidden}}"/> 
+0

Dank Gosha! Nur um Sie wissen zu lassen, dass die Bindung an "SelectedItem" sein sollte und dass die Rückgabewerte in der Funktion "Convert" entgegengesetzt sein sollten, geben Sie "Visible" zurück, wenn der angegebene Wert null ist. Danke noch einmal! – Idanis

+0

behoben, für nichts :) – igorushi