كيف يمكنك ربط خاصية TextWrapping الخاصة بـ TextBox بقيمة IsChecked الخاصة بـ MenuItem؟

StackOverflow https://stackoverflow.com/questions/250840

سؤال

تحتوي الخاصية TextWrapping الخاصة بـ TextBox على ثلاث قيم محتملة:

  • طَوّق
  • NoWrap
  • WrapWithOverflow

أرغب في الارتباط بخاصية IsChecked الخاصة بـ MenuItem.إذا تم تحديد MenuItem، فأنا أريد تعيين خاصية TextWrapping الخاصة بـ TextBox على Wrap.إذا لم يتم تحديد MenuItem، فأنا أرغب في تعيين خاصية TextWrapping الخاصة بـ TextBox إلى NoWrap.

لتلخيص ذلك، أحاول ربط عنصر تحكم يحتوي على حالتين بقيمتين من التعداد الذي يحتوي على أكثر من قيمتين.

[يحرر] وأود أن إنجاز هذا في XAML، إذا كان ذلك ممكنا.

[يحرر] لقد اكتشفت كيفية القيام بذلك باستخدام IValueConverter.ربما هناك طريقة أفضل للقيام بذلك؟وهنا ما فعلته:


في Window.Resources، قمت بتعريف مرجع إلى ValueConverter الخاص بي.

<local:Boolean2TextWrapping x:Key="Boolean2TextWrapping" />

في TextBox الخاص بي، قمت بإنشاء الارتباط لعنصر MenuItem وقمت بتضمين المحول في بيان الربط.

TextWrapping="{Binding ElementName=MenuItemWordWrap, Path=IsChecked, Converter={StaticResource Boolean2TextWrapping}}"

ويبدو ValueConverter كما يلي:

public class Boolean2TextWrapping : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo cultureInfo)
        {
            if (((bool)value) == false)
            {
                return TextWrapping.NoWrap;
            }
            return TextWrapping.Wrap;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
هل كانت مفيدة؟

المحلول

إذا كنت تريد القيام بكل هذا في xaml فأنت بحاجة إلى استخدام ملف أسلوب و أ مشغل البيانات.

<StackPanel>
    <CheckBox x:Name="WordWrap">Word Wrap</CheckBox>
    <TextBlock Width="50">
        Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin lacinia nibh non augue. Pellentesque pretium neque et neque auctor adipiscing.

        <TextBlock.Style>
            <Style TargetType="{x:Type TextBlock}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsChecked, ElementName=WordWrap}" Value="True">
                        <Setter Property="TextWrapping" Value="Wrap" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</StackPanel>

نصائح أخرى

اعتقد انه الوحيد والحق الطريقة النموذجية للقيام بذلك هي استخدام محول القيم كما فعلت بالفعل.

في بعض الأحيان يمكنك العثور على محول قيمة موجود قمت بإنشائه بالفعل ...أو حتى الأفضل الذي صممته Microsoft لك.على سبيل المثال، في System.Windows.Controls، قامت Microsoft بكتابة BooleanToVisibilityConverter...الذي يحول منطقي إلى تعداد الرؤية ...تحويل صحيح إلى مرئي وخطأ إلى مطوي (وعدم القلق بشأن المخفي).

تتمثل إحدى الأفكار في استخدام .NET Reflector، والانتقال إلى System.Windows.Data.IValueConverter، ثم استخدام ميزة التحليل (على وجه الخصوص، "المستخدم بواسطة") ومعرفة الأشياء التي تم تطبيق IValueConverter ...وقد تكون محظوظًا للعثور على محول يناسب غرضك.

في ملاحظة ذات صلة، BooleanToVisibilityConverter مشابه جدًا لما تحاول القيام به أعلاه.

يحرر:يعجبني حقًا اقتراح Todd White بشأن تصميم TextBox واستخدام DataTrigger في النمط.إنها فكرة جيدة جدًا إذا كنت تريد تجنب المحول.

أفترض أنك تتحدث عن .NET.لا أعتقد أن ربط البيانات سيعمل هنا لأن القيم ليست من نفس النوع (منطقية مقابل التعداد).سيكون الحل الأسهل هو التعامل مع الحدث CheckedChanged لعنصر القائمة هذا وضبط وضع الالتفاف لمربع النص وفقًا لذلك.

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