DataGridTextColumn отображает NaN при нажатии кнопки - PullRequest
0 голосов
/ 24 октября 2018

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

Для простоты, скажем, имена Пеннциол, Кастрол и Вальволин.Их начальное процентное значение использования (предположим, что это число с плавающей запятой) и счетчик выпадений (int) равны 0. Если нажать кнопку «+» для строки, счетчик выпадений будет увеличиваться.Если Pennziol затем увеличивается на 1, его процентное использование станет 100% с остальными 0%.Если затем дважды щелкнуть Castrol, его процент составит 66,6%, а Pennziol уменьшится до 33,3%, а Valvoline останется 0%.

Предполагается, что мой код будет обновлять данные при каждом нажатии кнопки., но возвращает значение во всех Formula % ячейках столбца как NaN.

MainWindow.xaml.cs

private OilList mOilList = new OilList();

    public MainWindow()
    {
        InitializeComponent();

        // Add Oils to Oil Grid Table
        foreach (Oil oil in mOilList.Oils)
        {
            OilGridXaml.Items.Add(oil);        
        }          
    }


    private void Button_Click_Increment(object sender, RoutedEventArgs e)
    {        
        Oil oil = ((FrameworkElement)sender).DataContext as Oil;
        oil.AddDrop();

        mOilList.UpdateFormulaWeight();

        PerfumeGridXaml.Items.Refresh();
    }

Oil.cs

public void AddDrop()
    {
        mDropCount++;
        mOilAmount = mDropSize * mDropCount;
        NotifyPropertyChanged("DropCount");
    }

public float UsagePercentage
    {
        get { return mUsagePercentage; }
        set
        {
            if (mUsagePercentage != value)
            { 
                mUsagePercentage = value;
                NotifyPropertyChanged("UsagePercentage");
            }
        }
    }

OilList.cs

public void UpdateFormulaWeight()
    {
        foreach (Oil oil in mOils)
            mFormulaTotalWeight += oil.TotalWeight;

        foreach (Oil oil in mOils)
        {
            oil.UsagePercentage = (oil.TotalWeight / mFormulaTotalWeight) * 100f;
            NotifyPropertyChanged("UsagePercentage");
        }
    }

MainWindow.xaml

<DataGrid x:name="OilGridXaml" ... ItemsSource="{Binding}">...
<!-- USAGE PERCENTAGE -->
<DataGridTextColumn Header="Formula %" Foreground="LightGray" Binding="{Binding UsagePercentage, StringFormat={}{0:F2}%}" IsReadOnly="True" Width="64">
    <DataGridTextColumn.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Background" Value="#1e1e1e"/>
        </Style>
    </DataGridTextColumn.CellStyle>

    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="TextBlock.VerticalAlignment" Value="Center" />
            <Setter Property="TextBlock.TextAlignment" Value="Center" />
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

<!-- DROP COUNT -->
<DataGridTextColumn x:Name="Cell_Drop_Count" Header="Drop Count" Foreground="LightGray" Binding="{Binding DropCount}" Width="*">
    <DataGridTextColumn.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Background" Value="#1e1e1e"/>
        </Style>
    </DataGridTextColumn.CellStyle>

    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="TextBlock.VerticalAlignment" Value="Center" />
            <Setter Property="TextBlock.TextAlignment" Value="Center" />
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

ОБНОВЛЕНИЕ

Oil и OilList наследует INotifyPropertyChanged с тем же эффектом

public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

В вашем коде, если результат (oil.TotalWeight / mFormulaTotalWeight) этого деления равен 0, тогда вы получите значение NaN в качестве вывода в соответствии с приведенной ниже строкой кода.

oil.UsagePercentage = (oil.TotalWeight / mFormulaTotalWeight) * 100f;

Также проверьте, являются ли типы данных плавающими / двойными для задействованных переменных / свойств.

0 голосов
/ 24 октября 2018

Я не вижу события PropertyChanged в вашем UsagePercentage.Я думаю, что стоимость вашего имущества изменится правильно, но DataGrid не будет обновляться тогда.Таким образом, он остается на своем первоначальном значении, которое, казалось, было NaN.

. PerfumeGridXaml.Items.Refresh() будет только воссоздавать вид, но не обновлять ItemsSource или любой из его элементов.

...