Обновление значения другого свойства при изменении свойства DependencyProperty - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть DependencyProperty в моем UserControl с обратным вызовом измененного свойства.Свойство работает как положено, а обратный вызов работает как положено.

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 в виде отформатированной строки.В настоящее время у меня есть свойство Text TextBlock, привязанное к CurrentFlow, и оно работает, но я не получаю нужный мне формат.(Слишком много чисел после десятичной дроби.)

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

В идеале я хотел бы иметь свойство с именем CurrentFlowString, которое принимает значение из CurrentFlow и форматирует его в соответствии с тем, что я хочу.Например: CurrentFlow.ToString ("0.00");

Какой лучший способ сделать это с DependencyProperties?Я знаю, как это сделать с обычными свойствами, но я застрял здесь.

Спасибо!

1 Ответ

0 голосов
/ 14 февраля 2019

Если вы хотите иметь больше гибкости, чем 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}}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...