سؤال

وأنا أحاول أن تنفيذ عنصر تحكم مستخدم برنامج الأغذية العالمي الذي يربط مربع نص إلى قائمة الزوجي باستخدام المحول. كيف يمكنني تعيين مثيل تحكم المستخدم أن يكون تحويل المعلمة؟

ويظهر رمز للسيطرة أدناه

والشكر

<UserControl x:Class="BaySizeControl.BaySizeTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:local="clr-namespace:BaySizeControl"
    >
    <UserControl.Resources>
        <local:BayListtoStringConverter x:Key="BaySizeConverter"/>
    </UserControl.Resources>
    <Grid>

        <TextBox  Name="Textbox_baysizes" 
                  Text="{Binding RelativeSource={RelativeSource self},
                                Path=Parent.Parent.BaySizeItemsSource, 
                                Converter={StaticResource BaySizeConverter}}"
                  />
    </Grid>
</UserControl>
هل كانت مفيدة؟

المحلول

والمعلمات للثوابت التي يحتاجها تحويل الخاص بك. لتوفير مثيل كائن لتحويل الخاص بك، يمكنك استخدام MultiBinding.

ملحوظة: للحصول على هذا الحل للعمل، تحتاج أيضا إلى تعديل تحويل لتنفيذ IMultiValueConverter بدلا من IValueConverter. لحسن الحظ، والتعديلات المعنية هي صغيرة إلى حد ما. ويمكنك إضافة التحقق من صحة عدد القيم المقدمة لتحويل الخاص بك، و 2 في قضيتك.

<TextBox Name="Textbox_baysizes">
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource BaySizeConverter}">
            <Binding RelativeSource="{RelativeSource self}" Path="Parent.Parent.BaySizeItemsSource"/>
            <Binding ElementName="Textbox_baysizes"/>
        </MultiBinding>
    </TextBox.Text>
</TextBox>

نصائح أخرى

وهناك طريقة أخرى تبذل الخاص بك تحويل يرث من DependencyObject (أو FrameworkElement). هذا يسمح لك أن يعلن خصائص التبعية، مما يجعل من الممكن تحديد قيمها من XAML، حتى ملزم.

وعلى سبيل المثال: تحويل لمضاعفة قيمة specifing العامل، والتي يتم الحصول عليها من خاصية (FactorValue) في عنصر تحكم مخصص (MyControl)

.

والمحول:

public class MyConverter : DependencyObject, IValueConverter
{
    // The property used as a parameter
    public double Factor
    {
        get { return (double) GetValue(FactorProperty); }
        set { SetValue(FactorProperty, value); }
    }

    // The dependency property to allow the property to be used from XAML.
    public static readonly DependencyProperty FactorProperty =
        DependencyProperty.Register(
        "Factor",
        typeof(double),
        typeof(MyConverter),
        new PropertyMetadata(1.15d));

    #region IValueConverter Members

    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // Use the property in the Convert method instead of "parameter"
        return (double) value * Factor;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

استخدم في XAML:

<MyConverter x:Key="MyConv"
             Factor={Binding ElementName=MyControl, Path=FactorValue}
/>

وهكذا، يمكنك الآن يعلن خاصية التبعية لكل معلمة التي تحتاج إليها في تحويل وربط ذلك.

وأود أن اسم عنصر التحكم ثم ربط باستخدام ElementName:

<UserControl x:Class="BaySizeControl.BaySizeTextBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:local="clr-namespace:BaySizeControl"
    Name="Foobar"
    >
    <UserControl.Resources>
        <local:BayListtoStringConverter x:Key="BaySizeConverter"/>
    </UserControl.Resources>
    <Grid>

        <TextBox  Name="Textbox_baysizes" 
                  Text="{Binding RelativeSource={RelativeSource self},
                                Path=Parent.Parent.BaySizeItemsSource, 
                                Converter={StaticResource BaySizeConverter,
                                ConverterParameter={Binding ElementName=Foobar} }}"
                  />
    </Grid>
</UserControl>

لا، انتظر، التي لن تعمل لأن ConverterParameter ليس التبعية الممتلكات، ولا هو ملزم لDependencyObject. ملحق ReleativeSource العلامات يجب أن تفعل ما تريد، وإن كنت لا تستخدم تداخل داخل MarkupExtension الآخر - ربما ليست تصرفت بشكل جيد في هذه الحالة:

<TextBox  Name="Textbox_baysizes" 
                      Text="{Binding RelativeSource={RelativeSource self},
                                    Path=Parent.Parent.BaySizeItemsSource, 
                                    Converter={StaticResource BaySizeConverter,
                                    ConverterParameter={RelativeSource self} }}"
                      />

وكان لي نفس المشكلة، ولكن لا يمكنني استخدام MultiBindings منذ أحتاج لتنفيذ طريقة ConvertBack بشكل صحيح. هنا هو الحل انتهى بي الأمر المنفذة لممتلكات IsChecked في خانة الاختيار ل:

<CheckBox>
    <CheckBox.IsChecked>
        <Binding Converter="{StaticResource myConverter}" Path="Value">
            <Binding.ConverterParameter>
                <FrameworkElement DataContext="{TemplateBinding DataContext}" />
            </Binding.ConverterParameter>
        </Binding>
    </CheckBox.IsChecked>
</CheckBox>

وأنا لست على دراية فائقة مع TemplateBindings (أو أي شيء WPF لهذه المسألة)، ولذلك ربما يكون هذا يعمل فقط لأن بلدي خانة الاختيار هو في DataTemplate ...

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