我的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实现此的最佳方法是什么?我知道如何使用常规属性执行此操作,但是我有点卡在这里。
谢谢!
答案 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}}" />