Dynami c StringFormat в XAML TextBox через свойство в ViewModel - PullRequest
0 голосов
/ 25 марта 2020

У меня есть представление XAML с 10 TextBox, привязанным к 10 свойствам моей ViewModel. Каждое из этих свойств в моей ViewModel имеет соответствующее свойство значению SignificantDigits. IE PropertyA имеет существенное значение di git, равное 2. PropertyB имеет значимое значение di git, равное 4. Поэтому в пользовательском интерфейсе я хочу отобразить PropertyA как 1.12 и PropertyB как 1.4312.

Is Есть ли способ использовать StringFormat для привязки к значению SignificantDi git на виртуальной машине, чтобы ограничить число отображаемых десятичных знаков?

Пример.

PropertyA = 1.231231;
PropertyB = 1.234234;

PropertyASignificantDigits = 2;
PropertyBSignificant Digits = 4;

<TextBox  Text="{Binding PropertyA, StringFormat={}{0:{PropertyASignificantDigits}}" TextAlignment="Center" />

В этом случае пользовательский интерфейс отображает PropertyA

Я бы предпочел не использовать конвертер, если я могу управлять им из xaml

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Вы можете выполнить это sh с помощью MultiBinding и IMultiValueConverter.

MultiBinding принимает ваше значение и количество десятичных разрядов, а затем использует настраиваемый преобразователь нескольких значений для string.Format значения, возвращая результат.

Вот простой пример :

XAML

<TextBox>
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource DecimalPlaceStringFormatConverter}">
            <Binding Path="PropertyAValue" />
            <Binding Path="PropertyADecimalPlaces" />
        </MultiBinding>
    </TextBox.Text>
</TextBox>

Конвертер

public class DecimalPlaceStringFormatConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string result = null;

        if (values.Length == 2 && values[0] is double value && values[1] is int decimalPlaces)
        {
            result = string.Format($"{{0:F{decimalPlaces}}}", value);
        }

        return result;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
0 голосов
/ 26 марта 2020

Благодаря Кейт rnet для меня ответ состоял в том, что вы не можете сделать это непосредственно в XAML, и вам необходимо использовать конвертер. Используя его ответ, вот так выглядит мой последний конвертер

public class DecimalPlaceStringFormatConverter : IMultiValueConverter
    {
        public object Convert( object[] values, Type targetType, object parameter, CultureInfo culture )
        {
            if( !decimal.TryParse( values[ 0 ].ToString(), out decimal value ) )
                return values[ 0 ].ToString();

            if( !int.TryParse( values[ 1 ].ToString(), out int decimalPlaces ) )
                return value;

            if( values.Length == 2 )
                return string.Format( $"{{0:F{decimalPlaces}}}", value );
            else
                return value;
        }

        public object[] ConvertBack( object value, Type[] targetTypes, object parameter, CultureInfo culture )
        {
            throw new NotImplementedException();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...