2013-03-18 5 views
5

मेरे पास दो User Control's मुख्य UserCotrol में बैठे हैं।संपत्ति द्वारा उपयोगकर्ता नियंत्रण को प्रतिस्थापित करना

उनमें से केवल एक मुख्य में होना चाहिए।

जब आप ViewModel में कुछ संपत्ति को बदलते हैं, मैं उन्हें इस तरह बदलने के लिए:

<UserControl> 
    <ContentControl> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Setter Property="Content"> 
        <Setter.Value> 
         <local:UserControl1/> 
        </Setter.Value> 
       </Setter> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsTwo}" Value="True"> 
         <Setter Property="Content"> 
          <Setter.Value> 
           <local:UserControl2/> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</UserControl> 

जब मैं संपत्ति को बदलने False को यह समस्याओं के बिना UserControl1 को जाता है, लेकिन जब मैं यह True को बदलने के लिए, देखते हैं डिस्प्ले के साथ समस्याएं और केवल तभी जब मैं स्क्रीन के बीच चल रहा हूं, एक अस्थायी समाधान के रूप में, मैंने हर बार ईवेंट बनाया है जब UserControl को 1 से 2 में बदलना चाहिए। जब वह ईवेंट चलता है तो मैं मुख्य UserControl हटा देता हूं और इसे फिर से बना देता हूं।

लेकिन मेरा सवाल यह है कि जब मैं एक में बदलता हूं तो मुझे फिर से बनाने की आवश्यकता नहीं होती है, और जब मैं दो में बदल जाता हूं तो मुझे इसकी आवश्यकता हो सकती है?

मुझे यह हल करने के लिए कोई विचार न दें (मैंने इसे स्वयं किया है), मैं समझाना चाहता हूं कि यह क्यों हो रहा है, यह मेरी रूचि है।

+0

"प्रदर्शन के साथ समस्याएं" से आपका क्या मतलब है? क्या आप एक स्क्रीनशॉट दिखा सकते हैं? –

+0

@DanPuzey, मेरा इरादा: यह स्क्रीन पर प्रदर्शित नहीं होना चाहिए क्योंकि इसे प्रदर्शित किया जाना चाहिए, ऐसा लगता है कि वह पिछले उपयोगकर्ता कंट्रोलर ('UserControl1') से फंस गया है, मैं अब भी इसका उपयोग नहीं कर सकता, (UserCotrol में बटन पर क्लिक कहीं भी नहीं जा रहा है, पहले नहीं और दूसरा नहीं) –

+0

यदि आप खिड़की को कम और पुनर्स्थापित करते हैं, तो कौन सा नियंत्रण प्रदर्शित होता है?मैं सोच रहा हूं कि किसी कारण से आपकी सामग्री बदल रही है, लेकिन खिड़की फिर से प्रस्तुत नहीं हो रही है। –

उत्तर

5

आप डब्ल्यूपीएफ ठीक है; मैं आपकी समस्या का पुनरुत्पादन नहीं कर सकता; एक नया WPF अनुप्रयोग प्रारंभ करें और इसे में इस डंप: फिर अपने उपयोगकर्ता नियंत्रण के साथ बदलें (याद आप अपने टेम्पलेट में उपयोगकर्ता नियंत्रण को बाध्य करने के लिए अगर आप चाहते हैं यह विशेष कुछ करने के लिए बाध्य आवश्यकता हो सकती है)

ViewModel.cs:

public class ViewModel : INotifyPropertyChanged 
{ 
    private bool _isTwo; 

    public bool IsTwo 
    { 
     get { return _isTwo; } 
     set 
     { 
      _isTwo = value; 
      OnPropertyChanged("IsTwo"); 
     } 
    } 

    public ICommand Switch 
    { 
     get { return new RelayCommand((_) => { IsTwo = !IsTwo; }, (_) => true); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class RelayCommand : ICommand 
{ 
    private readonly Action<object> _action; 
    private readonly Func<object, bool> _predicate; 

    public RelayCommand(Action<object> action, Func<object, bool> predicate) 
    { 
     _action = action; 
     _predicate = predicate; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return _predicate(parameter); 
    } 

    public void Execute(object parameter) 
    { 
     _action(parameter); 
    } 

    public event EventHandler CanExecuteChanged; 
} 

MainWindow

<Window.DataContext> 
    <local:ViewModel/> 
</Window.DataContext> 

<DockPanel> 
    <Button DockPanel.Dock="Top" Command="{Binding Switch}"> Switch </Button> 
    <UserControl> 
     <ContentControl > 
      <ContentControl.Style> 
       <Style TargetType="{x:Type ContentControl}"> 
        <Setter Property="Content"> 
         <Setter.Value> 
          <local:UserControl1 DataContext="{Binding UserControl1ViewModel}"/> 
         </Setter.Value> 
        </Setter> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsTwo}" Value="True"> 
          <Setter Property="Content"> 
           <Setter.Value> 
            <local:UserControl2/> 
           </Setter.Value> 
          </Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ContentControl.Style> 
     </ContentControl> 
     </UserControl> 
</DockPanel> 

दो नए (खाली) UserControls और सेट दो अलग अलग रंग बनाएँ:

Off On

इनमें से किसी एक को अपने परेशान उपयोगकर्ता नियंत्रक के साथ बदलें। यदि आपके पास लेआउट समस्याएं हैं, तो संभवतः आपके उपयोगकर्ता नियंत्रण स्वयं का आकार बदलने का प्रयास कर रहे हैं, या आपको उन्हें एक बेहतर कंटेनर में रखना होगा। मैं उपरोक्त को डॉकपैन में चिपका रहा हूं। जो उपलब्ध स्थान में नियंत्रण का विस्तार करने में आम तौर पर काफी अच्छा होता है।

[संपादित करें]

तो तुम, पता करने के लिए जब क्या बनाई गई है में यह कुछ messageboxes तमाचा चाहते हैं, तो आपके उपयोगकर्ता नियंत्रण के ctor

public UserControl1() 
{ 
    InitializeComponent(); 

    MessageBox.Show("Created UserControl1"); 
} 

public UserControl2() 
{ 
    InitializeComponent(); 

    MessageBox.Show("Created UserControl2"); 
} 

मेरे लिए, उन दोनों के आवेदन शुरू पर बनाया जाता है। यानी UserControl2 अभी तक दिखाई नहीं दे रहा है, लेकिन बनाया गया है। कोई यह मान लेगा कि डेटा ट्रिगर स्विच होने तक यह बाध्य नहीं है; लेकिन अगर आप अपने उपयोगकर्ता नियंत्रण में कुछ कोड-पीछे कर रहे हैं, तो यह WPF को खराब कर सकता है।

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