Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何用文本块绑定变量_Wpf_Data Binding_Textblock - Fatal编程技术网

Wpf 如何用文本块绑定变量

Wpf 如何用文本块绑定变量,wpf,data-binding,textblock,Wpf,Data Binding,Textblock,我想知道如何将文本块绑定到C#类中的变量 基本上,我的.cs文件中有一个“cart”变量。在该Cart类中,我可以访问不同的总计 下面是绑定的内容,但它似乎没有绑定到变量 <StackPanel Width="Auto" Height="Auto" Grid.ColumnSpan="2" Grid.Row="5" HorizontalAlignment="Right"> <TextBlock Name="Subtotal"

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

基本上,我的.cs文件中有一个“cart”变量。在该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>


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

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

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

替换出现的每一行代码:

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

如果您还想在购物车类更改时自动更新文本框,则类必须实现
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");
        }
    }

}
两种解决方案

第一个解决方案:

购物车
作为数据源放在代码后面:

DataSource = cart;
并对其进行如下约束:

{Binding Path=PropertyOfCart}
第二种解决方案:

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

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

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

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

Id。建议在最接近的公共祖先而不是整个窗口上设置数据上下文。。。。其他控件中的绑定如何?
{Binding Path=PropertyOfCart}
<UserControl .....snip..... x:Name="Root">
{Binding ElementName=Root, Path=Cart.PropertyOfCart}