Обновите другую ячейку в той же строке после редактирования внутри DataGrid - PullRequest
0 голосов
/ 27 июня 2018

У меня есть два текстовых поля Скидка (%) и Цена (€) . Цена равна ReadOnly . Строка в DataGrid была построена с помощью класса MyData и Скидка привязана к значению скидка , Цена до цена . Когда я изменяю значение percantage на Discount , он должен рассчитать новую цену и изменить исходную стоимость price на новую цену. Но это не обновляет текстовое поле цена . Что мне нужно вызвать, чтобы вызвать обновление на цели?

Xaml:

<DataGridTemplateColumn Header="Discount(%)" Width="0.5*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox Name="tbDiscount" Text="{Binding Path=discount, Mode=TwoWay}" TextChanged="tbDiscount_TextChanged"></TextBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Price (€)" Width="0.5*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox Name="tbPrice" Text="{Binding Path=price, Mode=TwoWay}" IsReadOnly="True"></TextBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

C #:

MyData:

public class MyData
{
    public decimal price { set; get; }
    public int discount { get; set; }
}

как добавить строку в DataGrid

dataRow.discount = 0;
dataRow.price = price;
dataGridBasket.Items.Add(dataRow);

как я пытаюсь изменить значение цена для textvalue Изменено в TextBox Скидка :

private void tbDiscount_TextChanged(object sender, TextChangedEventArgs e)
{
    var text = sender as TextBox;

    text.GetBindingExpression(TextBox.TextProperty).UpdateSource();

    foreach(MyData item in dataGridBasket.Items)
    {
        item.price = item.price - (item.price * (Convert.ToDecimal(item.discount) / 100));
    }
}

1 Ответ

0 голосов
/ 27 июня 2018

логика изменения цены должна быть в MyData классе в discount сеттере. установите новое значение price и увеличьте значение PropertyChangedEvent в price setter.

Вам также необходимо сохранить исходную цену в каком-либо поле / объекте, чтобы правильно рассчитать цену со скидкой.

public class MyData : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    private decimal _basePrice;
    public decimal basePrice
    {
       get { return _basePrice; }
       set { _basePrice = value;  UpdatePrice(); }
    }

    private decimal _price;
    public decimal price
    {
       get { return _price; }
    }

    private int _discount;
    public int discount
    {
       get { return _discount; }
       set { _discount = value; UpdatePrice(); }
    }

    private void UpdatePrice()
    {
         _price = _basePrice * (100 - _discount) * 0.01M;
        OnPropertyChanged("price");
    } 
}

tbDiscount_TextChanged становится избыточным, и определения столбцов DataGrid могут быть упрощены:

<DataGridTemplateColumn Header="Discount(%)" Width="0.5*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=discount, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Price (€)"
                    Width="0.5*"
                    Binding="{Binding Path=price}"
                    IsReadOnly="True" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...