当DependencyProperty更改时,更新另一个属性的值

时间:2019-02-14 16:31:01

标签: wpf properties

我的UserControl中有一个DependencyProperty,其属性已更改为回调。该属性按预期工作,并且回调按预期工作。

public double CurrentFlow
{
    get { return (double)GetValue(CurrentFlowProperty); }
    set { SetValue(CurrentFlowProperty, value); }
}
public static readonly DependencyProperty CurrentFlowProperty = DependencyProperty.Register("CurrentFlow", typeof(double), typeof(MyUserControl), new PropertyMetadata(0.0, OnCurrentFlowPropertyChanged));

private static void OnCurrentFlowPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
    Console.WriteLine("CurrentFlow changed.");
}

但是,我的UserControl中有一个TextBlock,我想在其中将CurrentFlow显示为格式化的字符串。目前,我已经将TextBlock的Text属性绑定到CurrentFlow,并且它可以工作,但是我没有得到所需的格式。 (小数点后的数字太多。)

<TextBlock Text="{Binding Path=CurrentFlow, RelativeSource={RelativeSource AncestorType=UserControl}}" />

理想情况下,我想有一个名为CurrentFlowString的属性,该属性从CurrentFlow中获取值并将其格式化为所需的格式。例如:CurrentFlow.ToString(“ 0.00”);

使用DependencyProperties实现此的最佳方法是什么?我知道如何使用常规属性执行此操作,但是我有点卡在这里。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您想比使用StringFormat具有更大的灵活性,还可以使用自定义转换器。例如,

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double d)
            return $"{d:f2}";
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}

然后将其添加到您的UserControl.Resources,并在您的Binding中使用它:

<UserControl.Resources>
    <local:MyConverter x:Key="MyConverter" />
</UserControl.Resources>

<Grid>
    <TextBlock Text="{Binding Path=CurrentFlow, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource MyConverter}}" />
</Grid>

解决方案2 : 根据您在下面的评论,这是另一种解决方案。首先,创建一个新的依赖项属性;例如FormattedCurrentFlow

public static readonly DependencyProperty FormattedCurrentFlowProperty = DependencyProperty.Register(
    "FormattedCurrentFlow", typeof(string), typeof(MyControl), new PropertyMetadata(default(string)));

public string FormattedCurrentFlow
{
    get { return (string)GetValue(FormattedCurrentFlowProperty); }
    set { SetValue(FormattedCurrentFlowProperty, value); }
}

由于您已经拥有处理CurrentFlow中的更改的方法,因此当FormattedCurrentFlow发生更改时,请更新新的CurrentFlow

private static void OnCurrentFlowPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
    var myControl = (MyControl)source;
    myControl.FormattedCurrentFlow = $"{myControl.CurrentFlow:f2}";
}

TextBox中的UserControl现在可以绑定到FormattedCurrentFlow

<TextBlock Text="{Binding Path=FormattedCurrentFlow, RelativeSource={RelativeSource AncestorType=UserControl}}" />