Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 此绑定的转换器参数应该是什么_.net_Wpf_Xaml_Converter - Fatal编程技术网

.net 此绑定的转换器参数应该是什么

.net 此绑定的转换器参数应该是什么,.net,wpf,xaml,converter,.net,Wpf,Xaml,Converter,我试图实现一个wpf用户控件,该控件使用转换器将文本框绑定到一个双精度列表。如何将用户控件的实例设置为转换器参数 该控件的代码如下所示 谢谢 <UserControl x:Class="BaySizeControl.BaySizeTextBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/

我试图实现一个wpf用户控件,该控件使用转换器将文本框绑定到一个双精度列表。如何将用户控件的实例设置为转换器参数

该控件的代码如下所示

谢谢

<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>

这些参数用于转换器所需的常数。要向转换器提供对象实例,可以使用多重绑定

注意:要使此解决方案起作用,还需要修改转换器以实现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>

我将命名控件,然后使用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。RelativeSource标记扩展应该做您想做的事情,尽管我没有在其他MarkupExtension中嵌套使用它-在这种情况下,它可能表现不好:

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

我也遇到了同样的问题,但我不能使用多重绑定,因为我需要正确实现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中才起作用…

另一种方法是让转换器从DependencyObject(或FrameworkElement)继承。这允许您声明依赖属性,从而可以从XAML甚至绑定设置其值

示例:用于乘以指定因子的值的转换器,该值是从自定义控件(MyControl)中的属性(FactorValue)中获得的

转换器:

公共类MyConverter:DependencyObject,IValueConverter
{
//用作参数的属性
公共双重因素
{
获取{return(double)GetValue(FactorProperty);}
set{SetValue(FactorProperty,value);}
}
//允许从XAML使用该属性的dependency属性。
公共静态只读从属属性FactorProperty=
从属属性。寄存器(
“因素”,
类型(双),
类型(MyConverter),
新的房地产数据(1.15d));
#区域转换器成员
对象IValueConverter.Convert(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
//使用Convert方法中的属性,而不是“参数”
返回(双)值*系数;
}
对象IValueConverter.ConvertBack(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
#端区
}
在XAML中使用:

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


因此,您现在可以为转换器中所需的每个参数声明一个依赖项属性并进行绑定。

当然,您可以将对象引用作为转换器参数传递-确实,必须将其视为常量,因为WPF无法在设置转换器参数后重新绑定,但这并不意味着它不能成为对象引用@弗雷德里克:我在尝试这个代码时出错了。“属性'Converter'不支持'BaySizeControl.BayListtoStringConverter'类型的值。”。我的转换器需要修改才能使用此解决方案吗?@Daniel Paull:听起来可能有用。你能详细说明一下吗?thanks@Dave-请看我的博客“John Conway的使用嵌入式Python的XAML/WPF生活游戏”()。在“电路板视图”部分中,我传递一个对象数组作为转换器参数。希望有帮助。我已经试过这个方法了。传递的参数的类型为System.Windows.Data.RelativeSource。不是预期的BaySizeTextBox。我们不在“self”后面,请尝试“{RelativeSource FindAncestor,AncestorType={x:Type UserControl}}”。毕竟它将使用空datacontext。