绑定到转换器参数

dpa*_*ker 43 .net xaml binding converter silverlight-4.0

是否可以绑定到Silverlight 4.0中的ConverterParameter?

例如,我想做类似的事情,并将ConverterParameter绑定到ViewModel中的对象.

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

<RadioButton
  Content="{Binding Path=Mode}"
  IsChecked="{Binding
    Converter={StaticResource ParameterModeToBoolConverter},
    ConverterParameter={Binding Path=DataContext.SelectedMode,ElementName=root}}"
/>
Run Code Online (Sandbox Code Playgroud)

Joe*_*ide 54

不幸的是,你无法绑定到ConverterParameter.我过去使用了两个选项:不是使用Converter,而是在ViewModel上创建一个属性(或者你绑定的任何属性),为你进行转换.如果您仍想转换路径,将整个绑定对象传递给转换器,然后您可以这样进行计算.

  • 转换器是否继承了"DependencyObject"等,是不是有办法?我正在创作一个自定义控件,我需要根据控件中的另一个属性格式化绑定对象. (3认同)
  • "将整个绑定对象传递给转换器"是什么意思? (2认同)
  • 与@Clément 相同的问题,我想看看如何绑定整个绑定对象(在我的例子中是 datacontext)。 (2认同)

小智 20

另一个选择是通过创建一个包装其他转换器并从属性传入转换器参数的自定义转换器来获得乐趣.只要此自定义转换器继承DependencyObject并使用DependencyProperty,就可以绑定它.例如:

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

    <c:ConverterParamHelper.Converter>

        <c:RealConverter/>

    </c:ConverterParamHelper.Converter>

</c:ConverterParamHelper>
Run Code Online (Sandbox Code Playgroud)

  • @Nathan我想用这样的转换器比使用MultiBinding更容易实现`ConvertBack`.考虑一个`TimeConverter`,它将`DateTime`转换为格式化的仅时间字符串.当使用`MultiBinding`时,`ConvertBack`只会获得格式化的字符串,这不足以解析整个`DateTime`.Tim的转换器允许通过绑定将日期传递给`ConvertBack`. (2认同)

Ada*_*ski 17

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

public class WattHoursConverter : FrameworkElement, IValueConverter
    {

        #region Unit (DependencyProperty)

        /// <summary>
        /// A description of the property.
        /// </summary>
        public string Unit
        {
            get { return (string)GetValue(UnitProperty); }
            set { SetValue(UnitProperty, value); }
        }
        public static readonly DependencyProperty UnitProperty =
            DependencyProperty.Register("Unit", typeof(string), typeof(WattHoursConverter),
            new PropertyMetadata("", new PropertyChangedCallback(OnUnitChanged)));

        private static void OnUnitChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((WattHoursConverter)d).OnUnitChanged(e);
        }

        protected virtual void OnUnitChanged(DependencyPropertyChangedEventArgs e)
        {
        }

        #endregion


        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
// you can use the dependency property here
...
}
}
Run Code Online (Sandbox Code Playgroud)

在你的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" />
Run Code Online (Sandbox Code Playgroud)