سؤال

أحاول معرفة أفضل طريقة لتحديد جميع النصوص في مربع النص في المرة الأولى التي يتم فيها تحميل عنصر التحكم. أنا أستخدم نمط MVVM ، لذلك أنا أستخدم الربط ثنائي الاتجاه للخاصية النصية لمربع النص إلى سلسلة على ViewModel. أنا أستخدم مربع النص هذا "لإعادة تسمية" شيء له اسم بالفعل ، لذلك أود تحديد الاسم القديم عند تحميل عنصر التحكم بحيث يمكن حذفه بسهولة وإعادة تسميته. يتم ملء النص الأولي (الاسم القديم) عن طريق تعيينه في ViewModel الخاص بي ، ثم ينعكس في مربع النص بعد اكتمال ربط البيانات.

ماذا أود هل حقا مثل أن تفعل شيء مثل هذا:

<TextBox x:Name="NameTextBox" Text="{Binding NameViewModelProperty, Mode=TwoWay}" SelectedText="{Binding NameViewModelProperty, Mode=OneTime}" />

في الأساس ، استخدم النص بأكمله كـ SelectText مع ربط OneTime. ومع ذلك ، فإن هذا لا يعمل لأن SelectText ليس بمثابة اعتماد.

أنا لست ضد إضافة رمز التحديد في الرمز من وجهة نظري ، ولكن مشكلتي في هذه الحالة هي تحديد عند اكتمال ربط النص الأولي. يبدأ مربع النص دائمًا فارغًا ، لذلك لا يمكن القيام به في المنشئ. يبدو أن حدث TextChanged يطلق النار فقط عندما يدخل المستخدم نصًا جديدًا ، وليس عندما يتم تغيير النص من الربط الأولي لـ ViewModel.

أي أفكار موضع تقدير كبير!

هل كانت مفيدة؟

المحلول

دان ،

لقد كتبت فئة مشتقة بسيطة للغاية ، TextBoxEx ، توفر هذه الوظيفة. مستمدة من فئة TextBoxEx من مربع النص ، ويمكن الرجوع إليها في XAML لأي وجميع مربع النص الخاص بك. لا توجد طرق للاتصال. إنه يستمع فقط للأحداث التركيز ويختاره. بسيط جدا.

الاستخدام كما يلي:

في XAML ، قم بالرجوع إلى التجميع حيث تقوم بتنفيذ فئة TextBoxEx المدرجة أدناه ، وإضافة أكبر عدد ممكن من عناصر TextBoxEx كما تحتاج. يستخدم المثال أدناه ربط البيانات لعرض اسم مستخدم.

<UserControl x:Class="MyApp.MainPage"
    xmlns="http://schemas.microsoft.com/client/2007"     
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"     
    xmlns:c="clr-namespace:ClassLibrary;assembly=ClassLibrary"  
>  
.     
.     
.     
<c:TextBoxEx x:Name="NameTextBox" Text="{Binding NameViewModelProperty, Mode=TwoWay}" Width="120" />

هذا الرمز أدناه يعمل مع Silverlight 3.

using System.Windows;
using System.Windows.Controls;

namespace ClassLibrary
{
    // This TextBox derived class selects all text when it receives focus
    public class TextBoxEx : TextBox
    {
        public TextBoxEx()
        {
            base.GotFocus += OnGotFocus;
        }

        private void OnGotFocus(object sender, RoutedEventArgs e)
        {
            base.SelectAll();
        }
    }
}

حظا طيبا وفقك الله.

نصائح أخرى

سأترك حل جيم كإجابة ، منذ الاتصال SelectAll() على حدث gotfocus من مربع النص فعلت الخدعة.

لقد انتهى بي الأمر فعليًا في صنع مجموعة من المشاركات و eventTrigger للقيام بذلك بدلاً من التصنيف الفرعي لمربع النص أو القيام بذلك في الكود. كان من السهل حقًا القيام به ومن الجيد أن تكون قادرًا على الحفاظ على منطق السلوك مغلفًا وإضافته بشكل تعريفي في XAML إلى مربع نص موجود.

مجرد نشر هذا في حالة ظهور أي شخص آخر عبر هذا الموضوع وهو مهتم:

XAML:

<TextBox x:Name="NameTextBox" Text="{Binding NameViewModelProperty, Mode=TwoWay}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="GotFocus">
            <local:SelectAllAction/>
        </i:EventTrigger>
     </i:Interaction.Triggers>
</TextBox>

ج#

public class SelectAllAction : TriggerAction<TextBox>
{
    protected override void Invoke(object parameter)
    {
        if (this.AssociatedObject != null)
        {
            this.AssociatedObject.SelectAll();
        }
    }
}

فقط أريد إضافة رابط وجدته يتعلق بهذا - هنا مناقشة رائعة (اقرأ التعليقات) على السلوكيات مقابل الفئات الفرعية VVS المرفقة ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top