Форматирование значения привязки с помощью c # - PullRequest
1 голос
/ 28 марта 2012

В моем приложении я привязываю несколько текстовых полей к свойствам. Итак, в c # у меня есть:

public class MyUserControl : UserControl, INotifyPropertyChanged
{
    decimal _Price;
    public decimal Price
    {
       get { return _Price; }
       set
       {
          _Price = value;
          OnPropertyChanged("Price");
       }
    }

    // implement interface
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    // etc

, а на xaml у меня есть:

   <TextBox Name="txtPrice" DataContext="{Binding}" Text="{Binding Price, UpdateSourceTrigger=PropertyChanged, StringFormat=c}"></TextBox>

, тогда если в моем коде я установилНапример, цена = 12,22 будет отображать $ 12,22 в текстовом поле.


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

public class ControlBind<T> : INotifyPropertyChanged
{
    protected T _Value;
    public T Value
    {
        get { return _Value; }
        set
        {
            _Value = value;
            OnPropertyChanged("Value");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
                protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }



    public ControlBind(Control control, System.Windows.DependencyProperty controlPropertyToBind)
    {
        Binding b = new Binding("Value")
        {
            Source = this
        };

        b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        control.SetBinding(controlPropertyToBind, b);
    }
}

, тогда я смогу использовать этот класс и создать такое же поведение, выполнив:

// txtPrice is a textbox defined in xaml
ControlBind<decimal> Price = new ControlBind<decimal>(txtPrice, TextBox.TextProperty);

Price.Value = 45; // update textbox value to "45"

, но теперь я не знаю, каксделать формат строки.Когда я использую класс, текстовое поле печатает 45, и я хочу, чтобы оно напечатало $ 45

Другими словами, как я могу добиться связывания xaml {Binding Price, StringFormat=c} в коде

Ответы [ 3 ]

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

Не проверено, но я думаю:

 Binding b = new Binding("Value")
 {
      Source = this,
      StringFormat = "c"
 };
1 голос
/ 28 марта 2012

Вы должны быть в состоянии сделать это через Конвертеры .

Может попытаться закодировать что-то вроде этого из кода:

public ControlBind(Control control, System.Windows.DependencyProperty controlPropertyToBind)
{
   Binding b = new Binding("Value")
   {
     Source = this,
     Converter = new MyCurrencyConverter() //Converter
   };

   b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
   control.SetBinding(controlPropertyToBind, b);
}

Где MyCurrencyConverter преобразует ваши 45 в $45.

Надеюсь, это поможет.

0 голосов
/ 28 марта 2012

Чтобы сделать это исключительно в коде, вы можете просто сделать Price.ToString ("C"), иначе @ решение Тиграна с использованием преобразователей - это то, что вам нужно.

...