DataTrigger на StringFormat в WPF - PullRequest
0 голосов
/ 17 марта 2012

Когда я связываю объект с элементом управления WPF, я хочу отображать свойства с разным уровнем точности в зависимости от используемой системы единиц. Например, у меня есть свойство IsMetric, если значение равно true, я хочу отображать значения с одним десятичным знаком, если оно равно false, то с тремя десятичными знаками. В настоящее время я добавляю статическую строку ресурсов, которая добавляется к ресурсам в конструкторе перед вызовом InitialiseComponent(), например:

public RoomDisplay(Room room)
{
    string format = room.IsMetric ? "{0:0.0}" : "{0:0.000}";
    this.Resources.Add("format", format);
    InitializeComponent();
    this.DataContext = room;
}

Тогда Xaml выглядит так:

<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=Breadth, StringFormat={StaticResource ResourceKey=format}}" TextAlignment="Right" />

Это сработало до сих пор. Однако этот подход не подходит для встроенных элементов управления, и я никогда не был доволен этим подходом.

Я исследовал DataTriggers, что-то вроде:

<DataTrigger Binding="{Binding IsMetric}" Value="true">
    <Setter Property="Text" Value="{Binding Breadth, StringFormat=F1}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsMetric}" Value="false">
    <Setter Property="Text" Value="{Binding Breadth, StringFormat=F3}"/>
</DataTrigger>

Однако это боль, которую нужно добавить ко всем текстовым блокам. В идеале я хотел бы поместить это в стиль, но я не могу найти способ просто установить StringFormat без текстового значения.

Другой вариант - иметь свойство format в объекте и привязывать к нему StringFormat, но я бы предпочел держаться подальше от этого. Есть идеи? Спасибо.

1 Ответ

1 голос
/ 17 марта 2012

Действительно, я думаю, что самое простое было бы иметь в классе Room свойство BreadthString, если вы помните, чтобы отправлять правильные уведомления соответствующим установщикам.

class Room {
    private double _breadth;
    public Breadth {
        get { return _breadth; }
        set { _breadth = value; Raise("Breadth"); Raise("BreadthString"); }
    }

    private bool _isMetric;
    public bool IsMetric {
        get { return _isMetric; }
        set { _isMetric = value; Raise("IsMetric"); Raise("BreadthString"); }
    }

    public string BreathString {
        get { return Breadth.ToString( IsMetric ? "0.0" : "0.000" ); }
    }
}

Вы предложили иметь свойство 'format' в Room - я не думаю, что оно будет работать, потому что StringFormat не является свойством зависимостей в объекте зависимостей (я могу ошибаться здесь), но есть много других способов. Например, у вас может быть конвертер клиента (особенно, если нужно указать больше, чем свойство Breadth). Или вы можете иметь пользовательский элемент управления, полученный из TextBlock. Или вы можете иметь два DataTemplates для и TemplateTemplateSelector. Или у вас может быть ControlTemplate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...