.net 绑定到转换器参数
是否可以在Silverlight 4.0中绑定到转换器参数 例如,我想这样做,并将ConverterParameter绑定到ViewModel中的一个对象 如果不可能,还有其他选择吗.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
<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;}