2010-11-28 23 views
9

DataContext'ten Özelliklerin Değerlerini temel alarak öğeleri göstermek/gizlemek istediğimi, nasıl destekleyebilirim? XAML içinde DataContext'ten Özelliklere Dayalı Tetikleyiciler

// In MainWindow.xaml.cs: DataContext of MainWindow.xaml 
public int Mode { get; set; } 

, ben Mode dayalı gizleme elemanları göstermek istiyorum. Aşağıdaki işi nasıl yapabilirim? Veya bunun uygulanmasının uygun yolu nedir?

<StackPanel> 
    <StackPanel.Triggers> 
     <Trigger Property="Mode" Value="1"> 
      <Setter TargetName="txt1" Property="Visibility" Value="Visible" /> 
      <Setter TargetName="txt2" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="txt3" Property="Visibility" Value="Visible" /> 
     </Trigger> 
     <Trigger Property="Mode" Value="2"> 
      <Setter TargetName="txt1" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="txt2" Property="Visibility" Value="Visible" /> 
      <Setter TargetName="txt3" Property="Visibility" Value="Collapsed" /> 
     </Trigger> 
    </StackPanel.Triggers> 
    <TextBlock Text="TextBlock 1" x:Name="txt1" /> 
    <TextBlock Text="TextBlock 2" x:Name="txt2" /> 
    <TextBlock Text="TextBlock 3" x:Name="txt3" /> 
</StackPanel> 

Şu anda, alıyorum Hatası "Mülkiyet 'Mod' türü 'StackPanel' bulunamadı D.: \ Tmp \ WpfApplication1 \ TriggersAndProperties \ MainWindow.xaml" dir

cevap

10

sen bağlantılarındaki çalışabilirsiniz tetikleyicileri istiyorsanız DataTriggers kullanmak gerekir: 'Mod' amacıyla bu şekilde kullanılacak bir bağımlılık özelliği olması gerekir. Sorun böyle bir tanımlamanız gerekir böylece DataTriggers tarzı ve şablona kullanılabildiğini geçerli:

<StackPanel> 
    <StackPanel.Style> 
    <Style TargetType="{x:Type StackPanel}"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=Mode}" Value="1"> 
      <Setter TargetName="txt1" Property="Visibility" Value="Visible" /> 
      <Setter TargetName="txt2" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="txt3" Property="Visibility" Value="Visible" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=Mode}" Value="2"> 
      <Setter TargetName="txt1" Property="Visibility" Value="Collapsed" /> 
      <Setter TargetName="txt2" Property="Visibility" Value="Visible" /> 
      <Setter TargetName="txt3" Property="Visibility" Value="Collapsed" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </StackPanel.Style> 
    <TextBlock Text="TextBlock 1" x:Name="txt1" /> 
    <TextBlock Text="TextBlock 2" x:Name="txt2" /> 
    <TextBlock Text="TextBlock 3" x:Name="txt3" /> 
</StackPanel> 

Başka bir çözüm Visibility istediğiniz kadar Mode den int dönüştüren bir IValueConverter kullanmak olacak ve bunu geçerli olacak doğrudan her bir metin bloğu Visibility özelliği.

Dean Chalk'ın yanıtının geçerli olduğunu unutmayın: DependencyProperty'u kullanmanız veya Mode'da değişiklik yapmak istiyorsanız INotifyPropertyChanged'u uygulayın.

+0

Derleme hatası var MC4011: TargetName özelliği bir Stil Ayarlayıcıda ayarlanamıyor – Lu55

+0

Örneğiniz çalışmıyor. "Txt1" ismi tanınmadı. – FINDarkside

1

Sizin propert

public class MainViewModel : DependencyObject 
{ 
    readonly DependencyProperty ModeProperty = DependencyProperty 
     .Register("Mode", typeof(int), typeof(MainViewModel)); 

    public int Mode 
    { 
     get { return (int) GetValue(ModeProperty); } 
     set { SetValue(ModeProperty, value); } 
    } 
} 
+0

Bir durumun datatrigger olduğu bir multitrigger'ım varsa ne olur? ve bir ui-element özelliği miydi? –

İlgili konular