【问题标题】:How to bind a variable with a textblock如何将变量与文本块绑定
【发布时间】:2011-05-19 16:16:26
【问题描述】:

我想知道如何将文本块绑定到我的 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>

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

【问题讨论】:

    标签: wpf data-binding textblock


    【解决方案1】:

    如果您还希望 TextBoxes 在您的购物车类更改时自动更新,您的类必须实现 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");
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      ElementName in binding 用于引用其他控件,而不是后面代码中的变量。要在后面的代码中引用变量,您需要将该变量分配给 Control 的 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>
      

      在你的窗口的构造函数或加载事件中,编写以下代码:

      this.DataContext = cart;
      

      【讨论】:

      • 我建议在最近的共同祖先而不是整个窗口上设置数据conetext....其他控件中的绑定呢?
      【解决方案3】:

      两种解决方案..

      第一个解决方案:

      cart 作为DataSource 放在你的代码后面:

      DataSource = cart;
      

      并按如下方式绑定到它:

      {Binding Path=PropertyOfCart}
      

      第二种解决方案:

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

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

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

      像这样绑定它:

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

      请注意,购物车必须是您的 UserControl 的属性,而不是字段

      【讨论】:

        【解决方案4】:

        您需要将您的类设置为表单的数据源。另见this question

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-07
          • 2014-10-04
          • 2012-09-06
          • 1970-01-01
          • 1970-01-01
          • 2014-07-19
          • 2018-09-24
          • 1970-01-01
          相关资源
          最近更新 更多