stringformat c# wpf data-binding ivalueconverter

c# - stringformat - IValueConverter con propiedades de dependencia enlazada



wpf datagrid stringformat (1)

Necesito determinar el StringFormat de algunos TextBlocks encuadernados en tiempo de ejecución en función del sistema de unidad identificado en el objeto a vincular.

Tengo un convertidor con una Propiedad de dependencia al que me gustaría vincularme. El valor Bound se usa para determinar el proceso de conversión.

public class UnitConverter : DependencyObject, IValueConverter { public static readonly DependencyProperty IsMetricProperty = DependencyProperty.Register("IsMetric", typeof(bool), typeof(UnitConverter), new PropertyMetadata(true, ValueChanged)); private static void ValueChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) { ((UnitConverter)source).IsMetric = (bool)e.NewValue; } public bool IsMetric { get { return (bool)this.GetValue(IsMetricProperty); } set { this.SetValue(IsMetricProperty, value); } } object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (IsMetric) return string.Format("{0:0.0}", value); else return string.Format("{0:0.000}", value); } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }

Declaro el convertidor

<my:UnitConverter x:Key="Units" IsMetric="{Binding Path=IsMetric}"/>

y unir el TextBlock

<TextBlock Text="{Binding Path=Breadth, Converter={StaticResource Units}}" Style="{StaticResource Values}"/>

Sin embargo, recibo el siguiente error:

Error de System.Windows.Data: 2: no se puede encontrar FrameworkElemento o FrameworkContentElement para el elemento de destino. BindingExpression: Path = IsMetric; DataItem = null; el elemento objetivo es ''UnitConverter'' (HashCode = 62641008); la propiedad de destino es ''IsMetric'' (escriba ''Boolean'')

Supongo que esto se está inicializando antes de configurar el contexto de datos y, por lo tanto, no hay nada para vincular la propiedad IsMetric . ¿Cómo puedo lograr el resultado deseado?


Siempre que Breadth e IsMetric sean propiedades del mismo objeto de datos, puede usar un enlace múltiple junto con un convertidor multivalor :

<TextBlock> <TextBlock.Text> <MultiBinding Converter="{StaticResource UnitMultiValueConverter}"> <Binding Path="Breadth" /> <Binding Path="IsMetric" /> </MultiBinding> </TextBlock.Text> </TextBlock>

con un convertidor como este:

public class UnitMultiValueConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { double value = (double)values[0]; bool isMetric = (bool)values[1]; string format = isMetric ? "{0:0.0}" : "{0:0.000}"; return string.Format(format, value); } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }

El problema con su enfoque es que cuando UnitConverter se declara como recurso, no tiene un DataContext, y nunca lo obtendrá.

Y una cosa más importante: la devolución de llamada de UnitConverter.IsMetric para UnitConverter.IsMetric tiene sentido. Establece la misma propiedad de nuevo, que acaba de cambiar.