ما ينبغي أن تكون المعلمة تحويل لهذا الربط
سؤال
وأنا أحاول أن تنفيذ عنصر تحكم مستخدم برنامج الأغذية العالمي الذي يربط مربع نص إلى قائمة الزوجي باستخدام المحول. كيف يمكنني تعيين مثيل تحكم المستخدم أن يكون تحويل المعلمة؟
ويظهر رمز للسيطرة أدناه
والشكر
<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 ...