दिलचस्प पोस्ट
कैसे दो बीएसटी कुशलता से मर्ज करने के लिए? गतिशील सत्यापन और नाम AngularJS के साथ एक रूप में PHP एक स्ट्रिंग में स्ट्रिंग की पिछली घटना को बदलें? एंड्रॉइड स्क्रीन अभिविन्यास चेक और चयनित के लिए कौन से मान गलत हैं? एंड्रॉइड टुकड़ा वापस बटन प्रेस संभाल सैश प्रतिस्थापन के साथ बाश चर सी में स्ट्रिंग्स के लिए पॉइंटर की तुलना कैसे करें क्या यह पाइथनिक है कि सिर्फ साइड इफेक्ट्स के लिए लिस्ट का इस्तेमाल किया जाए? कक्षा से चर डेटा कैसे प्राप्त करें जिथुब एपीआई: सभी शाखाओं के लिए रेपो के लिए सभी कमानों को पुनः प्राप्त करें क्या एक एसक्यूएल सर्वर टेबल में दो पहचान स्तंभ हैं? लूप के लिए नेस्टेड पायथन वैक्टरिंग अंदर छवि के साथ html / css षट्भुज सी # – प्रकार के प्रकारों को प्रकार तर्क के रूप में इस्तेमाल नहीं किया जा सकता

दृश्य मॉडल (सी #) से WPF में पाठ बॉक्स पर फ़ोकस सेट करें

मेरे पास मेरे पास एक TextBox और एक Button है

अब मैं बटन क्लिक पर एक स्थिति की जांच कर रहा हूं और यदि स्थिति झूठी हो जाती है, तो उपयोगकर्ता को संदेश प्रदर्शित कर रहा है, और फिर मुझे TextBox नियंत्रण में कर्सर सेट करना होगा।

 if (companyref == null) { var cs = new Lipper.Nelson.AdminClient.Main.Views.ContactPanels.CompanyAssociation(); MessageBox.Show("Company does not exist.", "Error", MessageBoxButton.OK, MessageBoxImage.Exclamation); cs.txtCompanyID.Focusable = true; System.Windows.Input.Keyboard.Focus(cs.txtCompanyID); } 

उपरोक्त कोड ViewModel में है

CompanyAssociation दृश्य नाम है।

लेकिन कर्सर TextBox में सेट नहीं हो रहा है।

Xaml है:

 <igEditors:XamTextEditor Name="txtCompanyID" KeyDown="xamTextEditorAllowOnlyNumeric_KeyDown" ValueChanged="txtCompanyID_ValueChanged" Text="{Binding Company.CompanyId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="{Binding ActualWidth, ElementName=border}" Grid.Column="1" Grid.Row="0" VerticalAlignment="Top" HorizontalAlignment="Stretch" Margin="0,5,0,0" IsEnabled="{Binding Path=IsEditable}"/> <Button Template="{StaticResource buttonTemp1}" Command="{Binding ContactCommand}" CommandParameter="searchCompany" Content="Search" Width="80" Grid.Row="0" Grid.Column="2" VerticalAlignment="Top" Margin="0" HorizontalAlignment="Left" IsEnabled="{Binding Path=IsEditable}"/> 

Solutions Collecting From Web of "दृश्य मॉडल (सी #) से WPF में पाठ बॉक्स पर फ़ोकस सेट करें"

मुझे अपने प्रश्न के तीन भागों में जवाब दें

  1. मैं सोच रहा हूं कि आपके उदाहरण में "cs.txtCompanyID" क्या है? क्या यह एक पाठ बॉक्स नियंत्रण है? यदि हां, तो आप गलत रास्ते पर हैं। आम तौर पर यह आपके व्यू मॉोडल में यूआई के किसी भी संदर्भ का एक अच्छा विचार नहीं है। आप पूछ सकते हैं "क्यों?" लेकिन यह एक और सवाल है जो स्टैकरवर्फ फ्लो पर पोस्ट करता है 🙂

  2. फोकस के साथ मुद्दों को ट्रैक करने का सबसे अच्छा तरीका है … डीबगिंग। नेट स्रोत कोड मजाक नहीं। उसने मुझे कई बार कई बार बचाया नेट सोर्स कोड डीबगिंग सक्षम करने के लिए शॉन ब्रूके के ब्लॉग को देखें

  3. अंत में, सामान्य दृष्टिकोण जो कि मैं ViewModel से फ़ोकस सेट करने के लिए उपयोग करता हूं, सम्पन्न गुण है। मैंने बहुत सरल संलग्न संपत्ति लिखा है, जो किसी भी UIElement पर सेट किया जा सकता है। और उदाहरण के लिए ViewModel की संपत्ति "IsFocused" के लिए बाध्य किया जा सकता है। यह रहा:

     public static class FocusExtension { public static bool GetIsFocused(DependencyObject obj) { return (bool) obj.GetValue(IsFocusedProperty); } public static void SetIsFocused(DependencyObject obj, bool value) { obj.SetValue(IsFocusedProperty, value); } public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached( "IsFocused", typeof (bool), typeof (FocusExtension), new UIPropertyMetadata(false, OnIsFocusedPropertyChanged)); private static void OnIsFocusedPropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { var uie = (UIElement) d; if ((bool) e.NewValue) { uie.Focus(); // Don't care about false values. } } } 

    अब आपके व्यू में (एक्सएएमएल में) आप इस प्रॉपर्टी को अपने व्यू मॉोडल में बाँध सकते हैं:

     <TextBox local:FocusExtension.IsFocused="{Binding IsUserNameFocused}" /> 

उम्मीद है की यह मदद करेगा :)। यदि यह उत्तर # 2 का उल्लेख नहीं करता है

चीयर्स।

मुझे पता है कि इस प्रश्न का अब तक एक हजार गुना उत्तर दिया गया है, लेकिन मैंने उनको कुछ ऐसे संपादनों के लिए बनाया है जो मुझे लगता है कि ऐसे अन्य मुद्दों की सहायता करनी चाहिए जो मेरे पास थीं।

सबसे पहले, मैंने उपरोक्त संलग्न संपत्ति को इस प्रकार बदल दिया था:

 public static class FocusExtension { public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached("IsFocused", typeof(bool?), typeof(FocusExtension), new FrameworkPropertyMetadata(IsFocusedChanged)); public static bool? GetIsFocused(DependencyObject element) { if (element == null) { throw new ArgumentNullException("element"); } return (bool?)element.GetValue(IsFocusedProperty); } public static void SetIsFocused(DependencyObject element, bool? value) { if (element == null) { throw new ArgumentNullException("element"); } element.SetValue(IsFocusedProperty, value); } private static void IsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var fe = (FrameworkElement)d; if (e.OldValue == null) { fe.GotFocus += FrameworkElement_GotFocus; fe.LostFocus += FrameworkElement_LostFocus; } if (!fe.IsVisible) { fe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fe_IsVisibleChanged); } if ((bool)e.NewValue) { fe.Focus(); } } private static void fe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { var fe = (FrameworkElement)sender; if (fe.IsVisible && (bool)((FrameworkElement)sender).GetValue(IsFocusedProperty)) { fe.IsVisibleChanged -= fe_IsVisibleChanged; fe.Focus(); } } private static void FrameworkElement_GotFocus(object sender, RoutedEventArgs e) { ((FrameworkElement)sender).SetValue(IsFocusedProperty, true); } private static void FrameworkElement_LostFocus(object sender, RoutedEventArgs e) { ((FrameworkElement)sender).SetValue(IsFocusedProperty, false); } } 

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

अन्य बाधा अंतर्निहित प्रॉपर्टी को गलत तरीके से रीसेट करने का एक और शानदार तरीका बना रही थी, जब वह फ़ोकस खो गया था। यही वह जगह है जहां खोया फ़ोकस इवेंट के साथ में आया और सुनिश्चित किया गया कि वह दो बार मोड में xaml में बाध्यकारी सेट करे।

 <TextBox Text="{Binding Description}" FocusExtension.IsFocused="{Binding IsFocused, Mode=TwoWay}"/> 

यदि दृश्यता समस्या को संभालने का बेहतर तरीका है, तो कृपया मुझे बताएं

मुझे लगता है कि MVVM सिद्धांत को साफ रखने का सबसे अच्छा तरीका है, इसलिए मूल रूप से आपको मैसेंजर श्रेणी का उपयोग करना चाहिए जो कि MVVM लाइट के साथ प्रदान किया गया है और यहां इसका उपयोग करना है:

अपने व्यू-मॉडल में (उदाहरण ViewModel.cs): निम्नलिखित लिखिए

  Messenger.Default.Send<string>("focus", "DoFocus"); 

अब आपके व्यस.cs में (एक्सएएमएल नहीं view.xaml.cs) कंस्ट्रक्टर में निम्नलिखित लिखिए

  public MyView() { InitializeComponent(); Messenger.Default.Register<string>(this, "DoFocus", doFocus); } public void doFocus(string msg) { if (msg == "focus") this.txtcode.Focus(); } 

उस विधि को सिर्फ ठीक और कम कोड के साथ और एमवीवीएम मानकों को बनाए रखने

इनमें से कोई भी मेरे लिए बिल्कुल काम नहीं करता है, लेकिन दूसरों के लाभ के लिए, पहले से ही यहां दिए गए कुछ कोड के आधार पर मैंने यह लिखा था।

उपयोग निम्नानुसार होगा:

 <TextBox ... h:FocusBehavior.IsFocused="True"/> 

और कार्यान्वयन निम्नानुसार होगा:

 /// <summary> /// Behavior allowing to put focus on element from the view model in a MVVM implementation. /// </summary> public static class FocusBehavior { #region Dependency Properties /// <summary> /// <c>IsFocused</c> dependency property. /// </summary> public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached("IsFocused", typeof(bool?), typeof(FocusBehavior), new FrameworkPropertyMetadata(IsFocusedChanged)); /// <summary> /// Gets the <c>IsFocused</c> property value. /// </summary> /// <param name="element">The element.</param> /// <returns>Value of the <c>IsFocused</c> property or <c>null</c> if not set.</returns> public static bool? GetIsFocused(DependencyObject element) { if (element == null) { throw new ArgumentNullException("element"); } return (bool?)element.GetValue(IsFocusedProperty); } /// <summary> /// Sets the <c>IsFocused</c> property value. /// </summary> /// <param name="element">The element.</param> /// <param name="value">The value.</param> public static void SetIsFocused(DependencyObject element, bool? value) { if (element == null) { throw new ArgumentNullException("element"); } element.SetValue(IsFocusedProperty, value); } #endregion Dependency Properties #region Event Handlers /// <summary> /// Determines whether the value of the dependency property <c>IsFocused</c> has change. /// </summary> /// <param name="d">The dependency object.</param> /// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param> private static void IsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { // Ensure it is a FrameworkElement instance. var fe = d as FrameworkElement; if (fe != null && e.OldValue == null && e.NewValue != null && (bool)e.NewValue) { // Attach to the Loaded event to set the focus there. If we do it here it will // be overridden by the view rendering the framework element. fe.Loaded += FrameworkElementLoaded; } } /// <summary> /// Sets the focus when the framework element is loaded and ready to receive input. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.Windows.RoutedEventArgs"/> instance containing the event data.</param> private static void FrameworkElementLoaded(object sender, RoutedEventArgs e) { // Ensure it is a FrameworkElement instance. var fe = sender as FrameworkElement; if (fe != null) { // Remove the event handler registration. fe.Loaded -= FrameworkElementLoaded; // Set the focus to the given framework element. fe.Focus(); // Determine if it is a text box like element. var tb = fe as TextBoxBase; if (tb != null) { // Select all text to be ready for replacement. tb.SelectAll(); } } } #endregion Event Handlers } 

यह एक पुराना धागा है, लेकिन ऐसा लगता नहीं है कि कोड के साथ एक जवाब है जो मुद्दों को अनवंका के स्वीकृत उत्तर से संबोधित करता है: यदि आप संपत्ति को दृश्यमॉडेल में झूठी सेट करते हैं, या यदि आप अपनी संपत्ति को सेट करते हैं सच है, उपयोगकर्ता मैन्युअल रूप से कुछ और पर क्लिक करता है, और फिर आप इसे फिर से सच करने के लिए सेट करें मैं इन मामलों में मज़बूती से काम करने के लिए ज़मोटास के समाधान को नहीं मिल सका।

ऊपर दिए गए कुछ चर्चाओं को एक साथ खींचने से मुझे नीचे दिए गए कोड मिलते हैं जो मुझे लगता है कि इन मुद्दों का समाधान करता है:

 public static class FocusExtension { public static bool GetIsFocused(DependencyObject obj) { return (bool)obj.GetValue(IsFocusedProperty); } public static void SetIsFocused(DependencyObject obj, bool value) { obj.SetValue(IsFocusedProperty, value); } public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached( "IsFocused", typeof(bool), typeof(FocusExtension), new UIPropertyMetadata(false, null, OnCoerceValue)); private static object OnCoerceValue(DependencyObject d, object baseValue) { if ((bool)baseValue) ((UIElement)d).Focus(); else if (((UIElement) d).IsFocused) Keyboard.ClearFocus(); return ((bool)baseValue); } } 

यह कहने के बाद, यह कुछ भी है जो कोडबेहिन्द में एक पंक्ति में किया जा सकता है, और कॉससवल्यू वास्तव में इस तरह से इस्तेमाल नहीं किया जाता है, इसलिए हो सकता है कि कोडबेहिन्ंड जाने का रास्ता है।

समस्या यह है कि एक बार IsUserNameFocused सही पर सेट है, यह कभी झूठी नहीं होगा यह फ्रेमवर्क एलेमेंट के लिए GotFocus और LostFocus से निपटने के द्वारा इसे हल करता है।

मुझे स्रोत कोड स्वरूपण के साथ परेशानी थी इसलिए यहां एक लिंक है I

मेरे मामले में, फोकस एक्स्टेंशन काम नहीं करता जब तक कि IIsFocusedPropertyChanged विधि को परिवर्तित नहीं किया जाता। मूल एक केवल डीबग में काम कर रहा था जब ब्रेक पॉइंट ने प्रक्रिया रोक दी थी। रनटाइम में, यह प्रक्रिया बहुत तेज़ और कुछ भी नहीं है। इस छोटे बदलाव और हमारे मित्र कार्य की मदद से, यह दोनों परिदृश्यों में ठीक काम कर रहा है

 private static void OnIsFocusedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var uie = (UIElement)d; if ((bool)e.NewValue) { var action = new Action(() => uie.Dispatcher.BeginInvoke((Action)(() => uie.Focus()))); Task.Factory.StartNew(action); } } 

एंवकास शानदार कोड विंडोज डेस्कटॉप एप्लीकेशन के लिए है अगर आप मुझे पसंद कर रहे हैं और विंडोज स्टोर क्षुधा के लिए उसी समाधान की जरूरत है तो यह कोड आसान हो सकता है:

 public static class FocusExtension { public static bool GetIsFocused(DependencyObject obj) { return (bool)obj.GetValue(IsFocusedProperty); } public static void SetIsFocused(DependencyObject obj, bool value) { obj.SetValue(IsFocusedProperty, value); } public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached( "IsFocused", typeof(bool), typeof(FocusExtension), new PropertyMetadata(false, OnIsFocusedPropertyChanged)); private static void OnIsFocusedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if ((bool)e.NewValue) { var uie = d as Windows.UI.Xaml.Controls.Control; if( uie != null ) { uie.Focus(FocusState.Programmatic); } } } } 

उन लोगों के लिए जो उपरोक्त अनुनाक के समाधान का उपयोग करने की कोशिश कर रहे थे, मुझे केवल पहली बार काम करने के लिए बाध्यकारी समस्याएं थीं, क्योंकि खोए गए फोकस ने संपत्ति को गलत रूप से अद्यतन नहीं किया था आप मैन्युअल रूप से संपत्ति को गलत पर सेट कर सकते हैं और फिर हर बार सही कर सकते हैं, लेकिन आपकी संपत्ति में ऐसा कुछ करना बेहतर समाधान हो सकता है:

 bool _isFocused = false; public bool IsFocused { get { return _isFocused ; } set { _isFocused = false; _isFocused = value; base.OnPropertyChanged("IsFocused "); } } 

इस तरह आपको कभी भी इसे सही पर सेट करने की आवश्यकता होती है, और इसे फोकस मिलेगा

मैं WPF / Caliburn माइक्रो का उपयोग पाया है कि "dfaivre" ने एक सामान्य और व्यावहारिक समाधान यहां बनाया है: http://caliburnmicro.codeplex.com/discussions/222892

मुझे इसविवेबल समस्या का महत्वपूर्ण समाधान बहुत उपयोगी पाया। यह पूरी तरह से मेरी समस्या को हल नहीं किया था, लेकिन IsEnabled पैटर्न के लिए एक ही पैटर्न के बाद कुछ अतिरिक्त कोड था

IFocusedChanged विधि के लिए मैं जोड़ा:

  if (!fe.IsEnabled) { fe.IsEnabledChanged += fe_IsEnabledChanged; } 

और यहां हेन्डलर है:

 private static void fe_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) { var fe = (FrameworkElement)sender; if (fe.IsEnabled && (bool)((FrameworkElement)sender).GetValue(IsFocusedProperty)) { fe.IsEnabledChanged -= fe_IsEnabledChanged; fe.Focus(); } } 

सिल्वरलाइट के लिए:

 using System.Windows; using System.Windows.Controls; using System.Windows.Interactivity; namespace MyProject.Behaviors { public class FocusBehavior : Behavior<Control> { protected override void OnAttached() { this.AssociatedObject.Loaded += AssociatedObject_Loaded; base.OnAttached(); } private void AssociatedObject_Loaded(object sender, RoutedEventArgs e) { this.AssociatedObject.Loaded -= AssociatedObject_Loaded; if (this.HasInitialFocus || this.IsFocused) { this.GotFocus(); } } private void GotFocus() { this.AssociatedObject.Focus(); if (this.IsSelectAll) { if (this.AssociatedObject is TextBox) { (this.AssociatedObject as TextBox).SelectAll(); } else if (this.AssociatedObject is PasswordBox) { (this.AssociatedObject as PasswordBox).SelectAll(); } else if (this.AssociatedObject is RichTextBox) { (this.AssociatedObject as RichTextBox).SelectAll(); } } } public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.Register( "IsFocused", typeof(bool), typeof(FocusBehavior), new PropertyMetadata(false, (d, e) => { if ((bool)e.NewValue) { ((FocusBehavior)d).GotFocus(); } })); public bool IsFocused { get { return (bool)GetValue(IsFocusedProperty); } set { SetValue(IsFocusedProperty, value); } } public static readonly DependencyProperty HasInitialFocusProperty = DependencyProperty.Register( "HasInitialFocus", typeof(bool), typeof(FocusBehavior), new PropertyMetadata(false, null)); public bool HasInitialFocus { get { return (bool)GetValue(HasInitialFocusProperty); } set { SetValue(HasInitialFocusProperty, value); } } public static readonly DependencyProperty IsSelectAllProperty = DependencyProperty.Register( "IsSelectAll", typeof(bool), typeof(FocusBehavior), new PropertyMetadata(false, null)); public bool IsSelectAll { get { return (bool)GetValue(IsSelectAllProperty); } set { SetValue(IsSelectAllProperty, value); } } } } 

LoginViewModel.cs:

  public class LoginModel : ViewModelBase { .... private bool _EmailFocus = false; public bool EmailFocus { get { return _EmailFocus; } set { if (value) { _EmailFocus = false; RaisePropertyChanged("EmailFocus"); } _EmailFocus = value; RaisePropertyChanged("EmailFocus"); } } ... } 

Login.xaml:

 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:beh="clr-namespace:MyProject.Behaviors" <TextBox Text="{Binding Email, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> <i:Interaction.Behaviors> <beh:FocusBehavior IsFocused="{Binding EmailFocus}" IsSelectAll="True"/> </i:Interaction.Behaviors> </TextBox> 

या

 <TextBox Text="{Binding Email, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> <i:Interaction.Behaviors> <beh:FocusBehavior HasInitialFocus="True" IsSelectAll="True"/> </i:Interaction.Behaviors> </TextBox> 

फोकस सेट करने के लिए इसे कोड में करना चाहिए:

 EmailFocus = true; 

याद रखें कि यह प्लगइन एक html पृष्ठ का हिस्सा है, इसलिए पृष्ठ के अन्य नियंत्रणों पर फ़ोकस हो सकता है

 if (!Application.Current.IsRunningOutOfBrowser) { System.Windows.Browser.HtmlPage.Plugin.Focus(); } 

आप व्यू कॉमांड डिजाइन पैटर्न का उपयोग कर सकते हैं। यह MVVM डिज़ाइन पैटर्न के लिए एक विधि का वर्णन करता है जिसमें व्यू मॉडेल से कमांड के साथ दृश्य को नियंत्रित किया जाता है।

मैंने एमवीवीएम लाइट मेसेंजर क्लास का उपयोग करने के लिए राजा ए। माजिद के सुझाव पर आधारित इसे लागू किया है। ViewCommandManager क्लास कनेक्ट किए गए दृश्यों में कमांडों का उपयोग कर रहा है। यह मूल रूप से नियमित कमानों की दूसरी दिशा है, इन मामलों के लिए जब एक ViewModel को इसके व्यू में कुछ कार्रवाई करने की आवश्यकता होती है। यह प्रतिबिंब का उपयोग डेटा-बाध्य आदेशों और कमजोर संदर्भों को स्मृति लीक से बचने के लिए करता है।

http://dev.unclassified.de/source/viewcommand (CodeProject पर भी प्रकाशित)

मुझे निम्नलिखित के अनुसार संपादन कोड द्वारा समाधान मिला है बाइंडिंग प्रॉपर्टी को सेट करने की कोई आवश्यकता नहीं है, पहले झूठी तो सच्ची।

 public static class FocusExtension { public static bool GetIsFocused(DependencyObject obj) { return (bool)obj.GetValue(IsFocusedProperty); } public static void SetIsFocused(DependencyObject obj, bool value) { obj.SetValue(IsFocusedProperty, value); } public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached( "IsFocused", typeof(bool), typeof(FocusExtension), new UIPropertyMetadata(false, OnIsFocusedPropertyChanged)); private static void OnIsFocusedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d != null && d is Control) { var _Control = d as Control; if ((bool)e.NewValue) { // To set false value to get focus on control. if we don't set value to False then we have to set all binding //property to first False then True to set focus on control. OnLostFocus(_Control, null); _Control.Focus(); // Don't care about false values. } } } private static void OnLostFocus(object sender, RoutedEventArgs e) { if (sender != null && sender is Control) { (sender as Control).SetValue(IsFocusedProperty, false); } } } 

ऐसा लगता है कि किसी को बाइन किए गए चर के माध्यम से विशेषताओं को अपडेट करने में आसान बनाने के लिए अंतिम चरण शामिल है। यहाँ है जो मैं साथ आया था। मुझे बताएं कि ऐसा करने का बेहतर तरीका क्या है

XAML

  <TextBox x:Name="txtLabel" Text="{Binding Label}" local:FocusExtension.IsFocused="{Binding txtLabel_IsFocused, Mode=TwoWay}" /> <Button x:Name="butEdit" Content="Edit" Height="40" IsEnabled="{Binding butEdit_IsEnabled}" Command="{Binding cmdCapsuleEdit.Command}" /> 

ViewModel

  public class LoginModel : ViewModelBase { public string txtLabel_IsFocused { get; set; } public string butEdit_IsEnabled { get; set; } public void SetProperty(string PropertyName, string value) { System.Reflection.PropertyInfo propertyInfo = this.GetType().GetProperty(PropertyName); propertyInfo.SetValue(this, Convert.ChangeType(value, propertyInfo.PropertyType), null); OnPropertyChanged(PropertyName); } private void Example_function(){ SetProperty("butEdit_IsEnabled", "False"); SetProperty("txtLabel_IsFocused", "True"); } } 

सबसे पहले मैं अपनी फोकस समस्या को सुलझाने में मदद करने के लिए अवाका को धन्यवाद देना चाहूंगा हालांकि उस कोड में वह एक बग है, अर्थात् लाइन में: if (e.ldvalalue == null)

मुझे यह समस्या यह थी कि यदि आप पहले अपने दृश्य पर क्लिक करते हैं और नियंत्रण पर ध्यान केंद्रित करते हैं, तो ई। वोल्ट अब रिक्त नहीं है। फिर जब आप पहली बार के लिए नियंत्रण पर ध्यान केंद्रित करने के लिए चर सेट करते हैं, तो यह खोए हुए फोकस और गेटफोकस हैंडलर्स को सेट नहीं किया जा रहा है। इस प्रकार मेरा समाधान निम्नानुसार था:

 public static class ExtensionFocus { static ExtensionFocus() { BoundElements = new List<string>(); } public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached("IsFocused", typeof(bool?), typeof(ExtensionFocus), new FrameworkPropertyMetadata(false, IsFocusedChanged)); private static List<string> BoundElements; public static bool? GetIsFocused(DependencyObject element) { if (element == null) { throw new ArgumentNullException("ExtensionFocus GetIsFocused called with null element"); } return (bool?)element.GetValue(IsFocusedProperty); } public static void SetIsFocused(DependencyObject element, bool? value) { if (element == null) { throw new ArgumentNullException("ExtensionFocus SetIsFocused called with null element"); } element.SetValue(IsFocusedProperty, value); } private static void IsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var fe = (FrameworkElement)d; // OLD LINE: // if (e.OldValue == null) // TWO NEW LINES: if (BoundElements.Contains(fe.Name) == false) { BoundElements.Add(fe.Name); fe.LostFocus += OnLostFocus; fe.GotFocus += OnGotFocus; } if (!fe.IsVisible) { fe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fe_IsVisibleChanged); } if ((bool)e.NewValue) { fe.Focus(); } } private static void fe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { var fe = (FrameworkElement)sender; if (fe.IsVisible && (bool)((FrameworkElement)sender).GetValue(IsFocusedProperty)) { fe.IsVisibleChanged -= fe_IsVisibleChanged; fe.Focus(); } } private static void OnLostFocus(object sender, RoutedEventArgs e) { if (sender != null && sender is Control s) { s.SetValue(IsFocusedProperty, false); } } private static void OnGotFocus(object sender, RoutedEventArgs e) { if (sender != null && sender is Control s) { s.SetValue(IsFocusedProperty, true); } } } 
 public class DummyViewModel : ViewModelBase { private bool isfocused= false; public bool IsFocused { get { return isfocused; } set { isfocused= value; OnPropertyChanged("IsFocused"); } } } 
 System.Windows.Forms.Application.DoEvents(); Keyboard.Focus(tbxLastName);