gpt4 book ai didi

c# - 具有绑定(bind)依赖属性的 IValueConverter

转载 作者:太空狗 更新时间:2023-10-29 17:49:46 25 4
gpt4 key购买 nike

我需要根据要绑定(bind)的对象中标识的单位系统,在运行时确定某些绑定(bind)的 TextBlocksStringFormat

我有一个转换器,它有一个我想绑定(bind)到的依赖属性。绑定(bind)值用于确定转换过程。

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();
}
}

我声明转换器

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

并绑定(bind)TextBlock

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

然而,我收到以下错误:

System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定(bind)表达式:Path=IsMetric;数据项=空;目标元素是 'UnitConverter' (HashCode=62641008);目标属性是“IsMetric”(类型“ bool ”)

我想这是在我设置数据上下文之前初始化的,因此没有任何东西可以绑定(bind) IsMetric 属性。我怎样才能达到预期的结果?

最佳答案

假设 BreadthIsMetric 是同一数据对象的属性,您可以使用 MultiBinding结合 multi value converter :

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

使用这样的转换器:

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();
}
}

您的方法的问题在于,当 UnitConverter 被声明为资源时,它没有 DataContext,并且以后永远不会获得。

还有一件更重要的事情:UnitConverter.IsMetricValueChanged 回调是无稽之谈。它再次设置刚刚更改的相同属性。

关于c# - 具有绑定(bind)依赖属性的 IValueConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com