2013-07-11 27 views
7

WPF'de aşağıdaki Düğme ve Stil var ve DataTrigger bölümündeki Bağlama'yı genelleştirmem gerekiyor çünkü aynı Pencerede 10'a yakın benzer düğüme sahibim ve her düğme farklı bir özelliğe bağlanmalıdır (SelectedPositions, SelectedAgencies, ....). Uygulamak mümkün mü?WPF Stilinde DataTrigger Bağlama

<Button x:Name="btnPosition" 
      Grid.Row="0" 
      Grid.Column="0" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Center" 
      Command="{Binding PositionFilterCommand}" 
      Content="{l:Translate position}" 
      Style="{StaticResource NewButtonStyle}" /> 

    <Style x:Key="NewButtonStyle" TargetType="{x:Type Button}"> 
     <Setter Property="Foreground" Value="White" /> 
     <Setter Property="Height" Value="22" /> 
     <Setter Property="Width" Value="Auto" /> 
     <Setter Property="FontFamily" Value="OpenSans" /> 
     <Setter Property="FontSize" Value="13" /> 
     <Setter Property="Cursor" Value="Hand" /> 
     <Setter Property="Margin" Value="10,2,10,0" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Border CornerRadius="3"> 
         <Grid x:Name="gridButton" Background="#54728e"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 
          <Image x:Name="img" 
            Grid.Column="0" 
            Width="24" 
            Height="24" 
            Source="Img/tick-white.png" 
            Visibility="Visible" /> 
          <Rectangle x:Name="rect" 
             Grid.Column="1" 
             Fill="#54728e" 
             RadiusX="3" 
             RadiusY="3" /> 
          <ContentPresenter Grid.Column="1" 
               Margin="5,0,5,0" 
               HorizontalAlignment="Stretch" 
               VerticalAlignment="Center" /> 
         </Grid> 
        </Border> 
        <ControlTemplate.Triggers> 
         <DataTrigger Binding="{Binding SelectedPositions}" Value="{x:Static sys:String.Empty}"> 
          <Setter TargetName="rect" Property="Fill" Value="#8bbcdf" /> 
          <Setter TargetName="img" Property="Visibility" Value="Collapsed" /> 
          <Setter TargetName="gridButton" Property="Background" Value="#8bbcdf" /> 
         </DataTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

Aynı türdeki tüm bu özellikler (SelectedPositions, SelectedAgencies, ....) var mı? Öyleyse, ekli bir özelliği veya normal bağımlılık özelliğini düğüme kullanabilir ve ortak bir Stilde ve kontrolde bu değerin, ilgili DP'ye her ilgili kaynak özelliğine bağlı olduğunu kontrol edebilirsiniz. Aynı şeyi yapmak için 'Tag' özelliğini de kullanabilirsiniz, ancak genel olarak kaşlarını çattıran bir şeydir. – Viv

+0

Evet, bu özellikler aynı türde (Dizeler). Her Düğmenin kendi özelliği, içeriği ve komutu vardır. Lütfen bana açıkladığın şeyin bir örneğini verebilir misin? Şimdiden teşekkürler. – MauroBahia

+0

Evet, her birinin bir örneğini eklediniz. Seçimini al ve ihtiyacın için en iyisi için ona da bak. – Viv

cevap

19

Bana sen açıkladı dair bir örnek verebilir? Tabii

,

1 - En Style yılında Etiket

kullanma var senin DataTrigger olarak: kullanım için olduğu gibi

<DataTrigger Binding="{Binding Path=Tag, 
           RelativeSource={RelativeSource Self}}" 
       Value="{x:Static sys:String.Empty}"> 
    ... 
</DataTrigger> 

:

<Button x:Name="btnPosition" 
      Grid.Row="0" 
      Grid.Column="0" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Center" 
      Command="{Binding PositionFilterCommand}" 
      Content="{l:Translate position}" 
      Tag="{Binding SelectedPositions}" 
      Style="{StaticResource NewButtonStyle}" /> 

2 - Mülkiyet Ekli kullanma:

"yerel" uygulamanızın xaml ad takma atıfta ya da farklı ad alanları kullanırsanız, ad MyCustomPropertyCollection ilan nerede.

kod arkasında:

public class MyCustomPropertyCollection { 
    public static readonly DependencyProperty SomeStringProperty = 
    DependencyProperty.RegisterAttached(
     "SomeString", 
     typeof(string), 
     typeof(MyCustomPropertyCollection), 
     new FrameworkPropertyMetadata(string.Empty)); 

    public static void SetSomeString(UIElement element, string value) { 
    element.SetValue(SomeStringProperty, value); 
    } 

    public static string GetSomeString(UIElement element) { 
    return (string)element.GetValue(SomeStringProperty); 
    } 
} 

Style.DataTrigger

<DataTrigger Binding="{Binding Path=(local:MyCustomPropertyCollection.SomeString), 
           RelativeSource={RelativeSource Self}}" 
       Value="{x:Static sys:String.Empty}"> 
    ... 
</DataTrigger> 

kullanımı:

<Button x:Name="btnPosition" 
      Grid.Row="0" 
      Grid.Column="0" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Center" 
      Command="{Binding PositionFilterCommand}" 
      Content="{l:Translate position}" 
      local:MyCustomPropertyCollection.SomeString="{Binding SelectedPositions}" 
      Style="{StaticResource NewButtonStyle}" /> 

3 - Normal Bağımlılık Mülkiyet

özel Button sınıfı: xaml

public class MyButton : Button { 
    public static readonly DependencyProperty SomeStringProperty = 
    DependencyProperty.Register(
     "SomeString", 
     typeof(string), 
     typeof(MyButton), 
     new FrameworkPropertyMetadata(string.Empty)); 

    public string SomeString { 
    get { 
     return (string)GetValue(SomeStringProperty); 
    } 
    set { 
     SetValue(SomeStringProperty, value); 
    } 
    } 
} 

Stil sadece çok güncellenen DataTrigger ama Style tanımını ihtiyacı vardır.

<local:MyButton x:Name="btnPosition" 
      Grid.Row="0" 
      Grid.Column="0" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Center" 
      Command="{Binding PositionFilterCommand}" 
      Content="{l:Translate position}" 
      SomeString="{Binding SelectedPositions}" 
      Style="{StaticResource NewButtonStyle}" /> 
:

yüzden

<Style x:Key="NewButtonStyle" TargetType="{x:Type local:MyButton}"> 

Style.DataTrigger

<DataTrigger Binding="{Binding Path=SomeString, 
           RelativeSource={RelativeSource Self}}" 
       Value="{x:Static sys:String.Empty}"> 
    ... 
</DataTrigger> 

kullanım için

<Style x:Key="NewButtonStyle" TargetType="{x:Type Button}"> 

geçiş


Tag yaklaşımı üzerine kaş çatılır. "Eklenen Özellik" uygulamasının uygulanması daha kolaydır, ancak normal bir DP ve AP ile özel bir sınıf olarak bağımlılıkların bir göstergesinden de anlaşıldığı gibi fazla kullanılmaz. Tercihini istediğin gibi al.

+0

İlk seçeneği kullandım ve mükemmel bir şekilde çalıştım. Teşekkürler! – MauroBahia

+0

artı 1 3 yolun başarısını göstermek için 1 – KornMuffin

+0

"Value =" ... "," String.Empty "yerine belirli bir dizgede tetiklemeye çalışıyor olsaydı nasıl görünürdü? – phonetagger