2017-01-09 2 views
1

Я пытаюсь создать DataTemplate programmarically 100% в codebehind. Все работает отлично, за исключением того, что StringFormat для текстового связывания в текстовых блоках не работает.WPF StringFormat in Binding не работает в коде позади

Обычно в XAML, я бы сделать это так:

<TextBlock Text={Binding MyProperty, StringFormat=0.0} /> 

поэтому я предположил, что я мог бы просто установить StringFormat свойство Binding объекта, который я сделал. Я проверил, что он настроен правильно, и это так, но мое мнение по-прежнему не отражает форматирование. Зачем?

Вот отрывок из моего кода: функция, которая динамически создает DataTemplate для меня. Буквально все остальное работает отлично, от установки пути привязки к конверторам ivalue и всему. Только не строковый формат.

string propertyName = "myPropertyName"; 
FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock)); 

// the property I want is owned by myObject, which is a property of the datacontext 
string bindingString = String.Format("myObject[{0}]", propertyName); 
Binding binding = new Binding(bindingString) 
{ 
    Mode = BindingMode.OneWay, 
    Converter = (IValueConverter)Application.Current.FindResource("InvalidValuesConverter"), 
    StringFormat = "{0:F1}" // <-- Here is where I specify the stringFormat. I've also tried "0.0" 
}; 

textBlock.SetBinding(TextBlock.TextProperty, binding); 
+1

[MCVE] (http://stackoverflow.com/help/mcve) - ваш лучший друг. Потому что на данный момент все кажется [вероятно правильным] (http://stackoverflow.com/questions/14769529/binding-string-format-from-code-behind), но без реальных типов и форматированных строк и огромной кучи от несвязанного кода трудно быть уверенным. –

+0

Отредактировано для удаления ненужного кода – user3685285

+1

Переплет в коде позади имеет конвертер, поэтому он игнорирует StringFormat. – Clemens

ответ

1

Похоже, что вы видите, что StringFormat прикладывается, но это не делает числовое форматирование на строку значений ваш преобразователь возвращается. Поскольку конкретный формат, который вы используете, в нем ничего нет, кроме цифрового форматирования, в действительности конвертер + StringFormat обработка не является оператором в случае, отличном от NaN. Самый быстрый способ проверить это предположение - дать ему формат, такой как N={0:#}, что и я. Он отформатирован десятичным 3.5 как "N=4" и строка "3.5" как "N=3.5".

Естественно, values are passed through the converter before they're formatted.

С единственной целью вашего преобразователя заменить пустую строку для Double.NaN, я бы посоветовал, что ваш конвертер конвертировать только в строку в NaN случае, а в противном случае возвращает как- двойное значение является. Convert возвращает object, так что это не проблема.

Для простоты в приведенном ниже коде предполагается, что вы можете рассчитывать на value всегда будучи double.

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (double.IsNaN((double)value)) 
      ? "" 
      : value; 
    } 
Смежные вопросы