如何将变量绑定到TextBlock上

9

我想知道如何将文本块绑定到C#类中的变量。

基本上,我在我的.cs文件中有一个“购物车”变量。在Cart类中,我可以访问不同的总数。

以下是我的绑定代码,但它似乎无法绑定到变量...

<StackPanel
   Width="Auto"
   Height="Auto"
   Grid.ColumnSpan="2"
   Grid.Row="5"
   HorizontalAlignment="Right">
   <TextBlock
      Name="Subtotal"
      FontFamily="Resources/#Charlemagne Std"
      FontSize="20"
      Text="{Binding ElementName=cart, Path=SubTotal}">
   </TextBlock>
   <TextBlock
      Name="Tax"
      FontFamily="Resources/#Charlemagne Std"
      FontSize="20"
      Text="{Binding ElementName=cart, Path=Tax}">
   </TextBlock>
   <TextBlock
      Name="Total"
      FontFamily="Resources/#Charlemagne Std"
      FontSize="20"
      Text="{Binding ElementName=cart, Path=Total}">
   </TextBlock>
</StackPanel>

正确的做法是什么?再次感谢您的帮助!

4个回答

12

如果你想让文本框在购物车类更改时自动更新,那么你的类必须实现INotifyPropertyChanged接口:

class Cart : INotifyPropertyChanged 
{
    // property changed event
    public event PropertyChangedEventHandler PropertyChanged;

    private int _subTotal;
    private int _total;
    private int _tax;

    private void OnPropertyChanged(String property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    public int SubTotal
    {
        get
        {
            return _subTotal;
        }
        set
        {
            _subTotal = value;
            OnPropertyChanged("SubTotal");
        }
    }

    public int Total
    {
        get
        {
            return _total;
        }
        set
        {
            _total = value;
            OnPropertyChanged("Total");
        }
    }

    public int Tax
    {
        get
        {
            return _tax;
        }
        set
        {
            _tax = value;
            OnPropertyChanged("Tax");
        }
    }

}

7

ElementName在绑定中用于引用其他控件,而不是代码后面的变量。要引用代码后面的变量,您需要将该变量分配给控件的DataContext属性。

替换以下代码行的每个出现:

<TextBlock Name="Subtotal" FontFamily="Resources/#Charlemagne Std" FontSize="20" Text="{Binding ElementName=cart, Path=SubTotal}"></TextBlock>

使用:

<TextBlock Name="Subtotal" FontFamily="Resources/#Charlemagne Std" FontSize="20" Text="{Binding Path=SubTotal}"></TextBlock>

在您的 Window 构造函数或 Load 事件中,编写以下代码:
this.DataContext = cart;

我建议将数据上下文设置在最近的共同祖先上,而不是整个窗口...那其他控件中的绑定呢? - Machinarius

2

两种解决方案:

第一种解决方案:

在代码后端将cart作为数据源:

DataSource = cart;

并按如下方式绑定:

{Binding Path=PropertyOfCart}

第二种解决方案:

使用ElementName绑定到根控件,并通过该控件上的属性获取购物车:

将您的根/父控件命名为具有购物车属性的名称:

<UserControl .....snip..... x:Name="Root">

像这样绑定:

{Binding ElementName=Root, Path=Cart.PropertyOfCart}

请注意,Cart 必须是您的 UserControl 的属性,而不是字段。

0

你需要将你的类设置为表单的数据源。另请参阅这个问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接