.net 绑定到转换器参数

.net 绑定到转换器参数,.net,xaml,binding,silverlight-4.0,converter,.net,Xaml,Binding,Silverlight 4.0,Converter,是否可以在Silverlight 4.0中绑定到转换器参数 例如,我想这样做,并将ConverterParameter绑定到ViewModel中的一个对象 如果不可能,还有其他选择吗 <RadioButton Content="{Binding Path=Mode}" IsChecked="{Binding Converter={StaticResource ParameterModeToBoolConverter}, ConverterParameter={Bin

是否可以在Silverlight 4.0中绑定到转换器参数

例如,我想这样做,并将ConverterParameter绑定到ViewModel中的一个对象

如果不可能,还有其他选择吗

<RadioButton
  Content="{Binding Path=Mode}"
  IsChecked="{Binding
    Converter={StaticResource ParameterModeToBoolConverter},
    ConverterParameter={Binding Path=DataContext.SelectedMode,ElementName=root}}"
/>


不幸的是,不可以绑定到转换器参数。我在过去使用过两个选项:在ViewModel(或绑定到的任何对象)上创建一个属性,为您进行转换,而不是使用转换器。如果您仍要执行转换器路径,请将整个绑定对象传递给转换器,然后您可以通过这种方式进行计算。

另一个选项是创建自定义转换器,该转换器封装其他转换器并从属性传入转换器参数。只要此自定义转换器继承DependencyObject并使用DependencyProperty,就可以将其绑定到。例如:

<c:ConverterParamHelper ConverterParam="{Binding ...}">

    <c:ConverterParamHelper.Converter>

        <c:RealConverter/>

    </c:ConverterParamHelper.Converter>

</c:ConverterParamHelper>

我知道这是个老问题,但也许这对遇到它的人会有用。我找到的解决方案如下:

公共类WattHoursConverter:FrameworkElement,IValueConverter
{
#地区单位(从属财产)
/// 
///对财产的描述。
/// 
公共字符串单元
{
获取{return(string)GetValue(UnitProperty);}
set{SetValue(UnitProperty,value);}
}
公共静态只读DependencyProperty UnitProperty=
DependencyProperty.Register(“单位”)、typeof(字符串)、typeof(WattHoursConverter),
新PropertyMetadata(“,新PropertyChangedCallback(OnUnitChanged)));
私有静态void OnUnitChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
((瓦数转换器)d)和(e);
}
受保护的虚拟void OnUnitChanged(DependencyPropertyChangedEventArgs e)
{
}
#端区
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
//您可以在此处使用dependency属性
...
}
}
在您的xaml中:

<UserControl.Resources>
    <converters:WattHoursConverter x:Key="WattHoursConverter" Unit="{Binding UnitPropFromDataContext}"/>
 </UserControl.Resources>
....
  <TextBlock Grid.Column="1" TextWrapping="Wrap" Text="{Binding TotalCO2, Converter={StaticResource KgToTonnesConverter}}" FontSize="13.333" />

....

我找到了一个相关的SO帖子,我相信它回答了这个问题:

在我的具体示例中,我最终使用的xaml实现了上述示例,如下所示:

<conv:BindingProxy x:Key="iconCacheHolder" Value="{Binding ElementName=This,Path=IconCache}" />
<conv:UriImageConverter  x:Key="ImageConverter">
    <conv:UriImageConverter.Proxy>
        <conv:IconCacheProxy Value="{Binding Value, Source={StaticResource iconCacheHolder}}" />
    </conv:UriImageConverter.Proxy>
</conv:UriImageConverter>

可以创建自己的绑定,该绑定支持绑定到转换器参数。以下是如何使用它:

<RadioButton Content="{Binding Path=Mode}" 
    IsChecked="{BindingWithBindableConverterParameter Converter={StaticResource ParameterModeToBoolConverter},
    ConverterParameter={Binding Path=DataContext.SelectedMode,ElementName=root}}" />

难道没有办法让转换器从
DependencyObject
等继承吗。?我正在编写自定义控件,需要根据控件中的另一个属性设置绑定对象的格式。将整个绑定对象传递给转换器是什么意思?将对象传递给转换器,该转换器具有执行转换所需的所有属性。在转换器中,将传入的对象强制转换为特定类型。如果将整个对象传递给转换器,如何实现
ConvertBack
?重新创建初始对象?只有当所有原始属性都作为
value
传递给
ConvertBack
时才可能。与@Clément的问题相同,我想看看如何绑定整个绑定对象(在我的例子中是datacontext)。这种方法比使用多重绑定()?你能发布一个实现吗?@Nathan我想用这样的转换器比用多重绑定更容易实现
ConvertBack
。考虑一个<代码> TimeConverter <代码>,它将<代码>日期时间>代码转换为格式化时间的字符串。使用多绑定时,
ConvertBack
将只获取格式化字符串,这不足以解析整个
DateTime
。Tim的转换器也允许通过绑定到
ConvertBack
来传递日期。@TimGreenfield您能给我演示一下如何使用它吗?嗨,Tim,我很想试试,但我需要比上面显示的更多的上下文和信息。你能包括所有必要的部分来设置这个吗?ConverterParamHelper的源看起来像什么?RealConverter不仅存在,而且存在于包含绑定控件的元素的上下文中,等等。在半现实的示例中显示更多上下文将非常有用,因为我似乎无法使这种方法起作用。这看起来应该起作用,但我得到了旧的“找不到目标元素的治理FrameworkElement或FrameworkContentElement”,“DataItem=null”业务。UnitPropFromDataContext是viewmodel的属性吗?如果绑定没有DataItem,这并不重要。这很可怕,但这是唯一对我有效的东西:void View\u DataContextChanged(对象发送方,DependencyPropertyChangedEventArgs e){(FindResource(“ConverterKey”)作为ConverterType)。PropertyName=(DataContext作为ViewModelType)。ViewModelProperty;}