2010-11-28 10 views
9

से गुणों के आधार पर ट्रिगर्स मान लीजिए कि मैं डेटाकॉन्टेक्स्ट से गुणों के मूल्यों के आधार पर तत्वों को दिखाना/छिपाना चाहता हूं, मैं इसे कैसे प्राप्त कर सकता हूं?डेटा कॉन्टेक्स्ट

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

XAML में, मैं छिपाने तत्वों Mode के आधार पर दिखाना चाहते हैं। मैं नीचे काम कैसे कर सकता हूं? या इसे लागू करने का उचित तरीका क्या है?

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

वर्तमान में, त्रुटि मैं हो रही है "संपत्ति 'मोड' प्रकार 'StackPanel' में नहीं मिला था डी।: \ Tmp \ WpfApplication1 \ TriggersAndProperties \ MainWindow.xaml" है

उत्तर

10

आप DataTriggers उपयोग करने के लिए यदि आप चलाता है कि बाइंडिंग पर काम कर सकते हैं की जरूरत है: 'मोड' निर्भरता संपत्ति के क्रम में इस तरह से इस्तेमाल किया जा करने की जरूरत है। समस्या है, तो आप इस तरह एक परिभाषित करने की जरूरत DataTriggers शैली और टेम्पलेट पर ही उपलब्ध हैं:

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

एक अन्य समाधान एक IValueConverter कि Visibility आप चाहते हैं Mode से पूर्णांक धर्मान्तरित उपयोग करने के लिए होगा, और इसे लागू सीधे प्रत्येक पाठ ब्लॉक Visibility संपत्ति के लिए।

ध्यान दें कि डीन चाक का उत्तर वैध रहता है: आपको DependencyProperty का उपयोग करना होगा या INotifyPropertyChanged लागू करना होगा यदि आप ट्रिगर करने के लिए Mode पर परिवर्तन चाहते हैं।

+0

मिला संकलन त्रुटि MC4011: TargetName गुण स्टाइल सेटर – Lu55

+0

पर सेट नहीं किया जा सकता है आपका उदाहरण काम नहीं करता है। "नाम 'txt1' पहचाना नहीं गया है। – FINDarkside

1

आपका गुण

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

क्या होगा यदि मेरे पास एक multitrigger है जहां एक शर्त डेटाैट्रिगर है? और एक ui-element संपत्ति थी? –

संबंधित मुद्दे