使用c#格式化绑定值

时间:2012-03-27 20:41:52

标签: c# wpf binding string-formatting

在我的应用程序中,我将几个文本框绑定到属性。 所以在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>

然后如果在我的代码后面我设置了Price = 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 个答案:

答案 0 :(得分:1)

您应该可以通过Converters完成此操作。

可以尝试从后面的代码中编写类似的代码:

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

希望这有帮助。

答案 1 :(得分:1)

未经测试,但我认为:

 Binding b = new Binding("Value")
 {
      Source = this,
      StringFormat = "c"
 };

答案 2 :(得分:0)

要完全在代码中执行它,您可以只使用Price.ToString(“C”),否则@Tigran使用转换器的解决方案就是您想要的方式。