2013-07-05 2 views
1

имеет очень простой вопрос, но, похоже, я не смог найти для него ответ в Интернете. Возможно потому, что я не смотрю в нужные места.Пожар триггера в UserControl на основе DependencyProperty

У меня есть пользовательский элемент управления с DependencyProperty пользовательского типа перечисления. В XAML я хотел бы показать/скрыть элементы, основанные на значении типа перечисления. Я попытался сделать это с помощью DataTriggers, но я не смог заставить его работать.

<UserControl x:Class="WpfApplication1.DisplayIcon" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="50" d:DesignWidth="50" 
     x:Name="control"> 
<UserControl.Resources> 
    <Style TargetType="Ellipse"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Value="Ellipse" Binding="{Binding MyIconType, ElementName=control}"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

    <Style TargetType="Rectangle"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Value="Rectangle" Binding="{Binding MyIconType, ElementName=control}"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

</UserControl.Resources> 
<Grid> 
    <Ellipse x:Name="el1" Fill="Red" Width="30" Height="30" /> 
    <Rectangle x:Name="el2" Fill="Green" Width="20" Height="20" /> 
    <TextBlock Text="{Binding MyIconType, ElementName=control}" Margin="0,40,0,0"/> 
</Grid></UserControl> 

И мой код позади выглядит следующим образом:

public enum IconType 
{ 
    Ellipse, 
    Rectangle 
} 
public partial class DisplayIcon : UserControl 
{ 
    public DisplayIcon() 
    { 
     InitializeComponent(); 
    } 

    public IconType MyIconType 
    { 
     get { return (IconType)GetValue(MyIconTypeProperty); } 
     set { SetValue(MyIconTypeProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for MyIconType. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty MyIconTypeProperty = 
     DependencyProperty.Register("MyIconType", typeof(IconType), typeof(DisplayIcon), new PropertyMetadata(IconType.Ellipse)); 

} 

Может кто-нибудь мне помочь?

Спасибо,

Jim

ответ

0

Вы можете создать Style для каждого элемента и определить триггеры есть:

<UserControl x:Class="WpfApplication1.DisplayIcon" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignHeight="50" d:DesignWidth="50" 
    x:Name="control"> 

<UserControl.Resources> 

    <Style TargetType="Ellipse"> 
     <Style.Triggers> 
      <DataTrigger Value="Rectangle" Binding="{Binding MyIconType, ElementName=control}"> 
       <Setter Property="Visibility" Value="Collapsed"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

    <Style TargetType="Rectangle"> 
     <Style.Triggers> 
      <DataTrigger Value="Ellipse" Binding="{Binding MyIconType, ElementName=control}"> 
       <Setter Property="Visibility" Value="Collapsed"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

</UserControl.Resources> 

<Grid> 
    <Ellipse x:Name="el1" Fill="Red" Width="20" Height="20"/> 
    <Rectangle Grid.Row="1" x:Name="el2" Fill="Green" Width="20" Height="20"/> 
</Grid> 

EDIT:

Infact его горе Ульд, вероятно, имеет смысл инвертировать логику Visibility. Таким образом, вы можете добавлять фигуры без необходимости изменять код:

<UserControl x:Class="WpfApplication1.DisplayIcon" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignHeight="50" d:DesignWidth="50" 
    x:Name="control"> 

<UserControl.Resources> 

    <Style TargetType="Ellipse"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Value="Ellipse" Binding="{Binding MyIconType, ElementName=control}"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

    <Style TargetType="Rectangle"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Value="Rectangle" Binding="{Binding MyIconType, ElementName=control}"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

</UserControl.Resources> 

<Grid> 
    <Ellipse x:Name="el1" Fill="Red" Width="20" Height="20"/> 
    <Rectangle x:Name="el2" Fill="Green" Width="20" Height="20"/> 
</Grid> 

+0

Спасибо за ответ, но это, кажется, не работает. Триггеры не запускаются. – jim

+0

Я скопировал ваш код, и он не работает. У вас есть рабочая копия? – jim

+0

Я протестировал его, изменив значение MyIconType в обработчике нажатия кнопки. Работает для меня: private void ButtonBase_OnClick (отправитель объекта, RoutedEventArgs e) { if (MyIconType == IconType.Ellipse) MyIconType = IconType.Rectangle; else { MyIconType = IconType.Ellipse; } } –

Смежные вопросы