2016-05-05 4 views
1

У меня есть следующий код для размещения "WaterMark"TextBlock на любом wpf управления:Создание водяного знака шаблонного texblock МОФ

<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> 

В целях предотвращения дублирования этих строк для каждого элемента управления, я хочу bind это TextBlock, я хотите создать UserControl от него и использовать его как это:

<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"/> 

(я поместил TextBlock определение в включаемый dll файла, и это выглядит следующим образом:

<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> 

Дело в том, что DataTrigger является переплетен с контролем я в настоящее время, в приложении я разрабатываю: AvailableFrames, и если я хотел бы повторно использовать это dll в другом приложении, мне нужно будет изменить привязку DataTrigger.

Можно ли это сделать?

ответ

1

В этом конкретном случае NullToVisibilityConverter будет более простым решением

примера
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; 
    } 
} 

использования:

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

Благодаря Гоши! Чтобы сообщить вам, что привязка должна быть в 'SelectedItem' и что возвращаемые значения внутри функции Convert должны быть противоположными, возвращайте« Visible », если заданное значение равно NULL. Еще раз спасибо! – Idanis

+0

исправлено, не зря :) – igorushi