Как связать переменную с помощью текстового блока - PullRequest
8 голосов
/ 03 декабря 2010

Мне было интересно, как я смогу связать текстовый блок с переменной в моем классе C #.

В основном у меня есть переменная "cart" в моем файле .cs. В этом классе Корзина у меня есть доступ к различным суммам.

Ниже приведено то, что у меня есть для привязки, но, похоже, оно не привязывается к переменной ...

<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 ]

11 голосов
/ 03 декабря 2010

Если вы хотите, чтобы текстовые поля автоматически обновлялись при изменении класса корзины, ваш класс должен реализовать интерфейс 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 голосов
/ 03 декабря 2010

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>

А в конструкторе вашего окна или событии Load напишите следующий код:

this.DataContext = cart;
2 голосов
/ 03 декабря 2010

Два решения ..

Первое решение:

Поместите cart в качестве источника данных в свой код позади:

DataSource = cart;

Ипривязать к нему следующим образом:

{Binding Path=PropertyOfCart}

Второе решение:

Привязать к корневому элементу управления с помощью привязки ElementName и получить корзину через свойство этого элемента управления:

Назовите свой корневой / родительский элемент управления, где указана корзина:

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

Привязать к нему так:

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

Обратите внимание, что корзина должнасвойство вашего UserControl, а не поле

0 голосов
/ 03 декабря 2010

Вам необходимо установить свой класс в качестве источника данных для вашей формы.Смотри также этот вопрос .

...