2009-09-12 12 views
8

से एक WPF नियंत्रण की दृश्यता को कैसे बदला जाए मेरे पास एक WPF एप्लिकेशन है जहां एमवीवीएम पैटर्न और प्रिज्म 2 को लागू करने का प्रयास किया गया है। मेरे पास एक Usercontrol है जिसने किसी अन्य उपयोगकर्ता नियंत्रण से निकाली गई किसी ईवेंट की सदस्यता ली है। मैं सब्सक्राइबिंग नियंत्रण में कुछ बाल तत्वों की दृश्यता टॉगल करना चाहता हूं। घटनाओं को ठीक से निकाल दिया जाता है, यहां तक ​​कि मैं कुछ तत्वों को डेटा को बाध्य करने में सफलतापूर्वक सक्षम हूं। मैं ViewModel के साथ उस मामले के लिए दृश्यता या किसी भी शैली की संपत्ति को कैसे बांधूं और उन्हें गतिशील रूप से बदलूं।व्यूमोडेल

उत्तर

23

आप अपने व्यूमोडेल में एक बुलियन संपत्ति प्राप्त कर सकते हैं और उस संपत्ति को अपने नियंत्रण की दृश्यता संपत्ति में जोड़ सकते हैं। आप एक बूलियन मान asigning हो जाएगा के बाद से और दृश्यता संपत्ति एक दृश्यता गणन मूल्य की उम्मीद है, आपकी रूपान्तरण बनाने के लिए BooleanToVisibilityConverter कनवर्टर का उपयोग करना होगा

<Style.Resources> 
    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" /> 
</Style.Resources> 

<Image Visibility="{Binding Path=ShowImage, 
        Converter={StaticResource booleanToVisibilityConverter}}"/> 

आशा इस मदद करता है।

एज़ेकिएल Jadib

+0

किसी भी तरह से यह मेरे लिए काम नहीं करता है। मैंने Usercontrol में कनवर्टर घोषित किया। स्रोत अनुभाग और उपयोग की गई बाइंडिंग जैसा कि आपने टिप्पणी में समझाया है। – Raj

+1

क्षमा करें मेरी गलती। यह काम। धन्यवाद। – Raj

8

एक बूलियन संपत्ति को जोड़ने और एक मूल्य कनवर्टर काम करता है का उपयोग करते हुए, मैं अपने ViewModel, उदा के प्रकार दृश्यता की संपत्ति जोड़ने की सिफारिश करेंगे हालांकि

public Visibility ImageVisibility 
{ 
    get { return shouldShowImage ? Visibility.Visible : Visibility.Collapsed } 
} 

इस विधि का लाभ आप हर संपत्ति आप एक शेयर के स्तर का जब यह नीचे चला जाता है 10 कि एक लेबल लाल हो जाता है के लिए विजुअल तरीके व्यक्त करने के लिए (उदाहरण के लिए चाहते हैं के लिए एक कनवर्टर लिखने की जरूरत नहीं है है, आपके पास एक कनवर्टर हो सकता है जिसे आप एक बार उपयोग करते हैं या बस अपने वीएम से स्टॉक लेबेलब्रश संपत्ति का पर्दाफाश कर सकते हैं)

+0

हालांकि यह उत्तर सुरुचिपूर्ण है, इसके साथ एक समस्या है। यदि कार्यक्रम 'shouldShowImage' को बदलता है, तो वह परिवर्तन दृश्य में नहीं भेजा जाता है। – James

+1

यह सच है, लेकिन समस्या को संभालने के कुछ तरीके हैं। आप या तो 'mustShowImage' से' PropertyChanged' ईवेंट को संभाल सकते हैं और एक नया 'PropertyChanged' ईवेंट बढ़ा सकते हैं, या केवल एक रैपर प्रॉपर्टी के माध्यम से 'shouldShowImage' तक पहुंच की इजाजत दे सकते हैं जो दोनों गुणों के लिए ईवेंट उठाता है। – Darren

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन इस समस्या में भाग लेने वाले लोगों के लिए एक आसान समाधान है और यह जवाब मिल गया है। अपने XAML में बाँध इसे करने के लिए तो जैसे

public Visibility ShowModifyButtons 
    { 
     get { return (Visibility)GetValue(ShowModifyButtonsProperty); } 
     set { SetValue(ShowModifyButtonsProperty, value); } 
    } 
public static readonly DependencyProperty ShowModifyButtonsProperty = 
     DependencyProperty.Register("ShowModifyButtons", typeof(Visibility), typeof(FileMatchViewModel), 
     new UIPropertyMetadata(Visibility.Collapsed)); 

,: आपके विचार मॉडल से

<Button Focusable="False" Content="Save" Width="100" Margin="10" Visibility="{Binding ShowModifyButtons}"/> 

अब, आप

आपके विचार मॉडल में, एक "दृश्यता" संपत्ति इतनी तरह बनाने ShowModifyButtonsVisibility.Collapsed या Visibility.Visible को आवश्यकतानुसार सेट कर सकते हैं।

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