簡體   English   中英

更改WPF DataGrid單元格時如何更新總計摘要?

[英]How to Update Total summary when WPF DataGrid cells are changed?

我有一個匯總表。 當輸入新行時,它們將更新。 但是,我希望它們隨着新行或現有行中單元格的更改而更新。 我閱讀了幾篇文章,並確定處理單元更改事件,然后在網格上運行UpdateTotalSummary方法可以解決問題,但事實並非如此。 以下是我正在使用的代碼,並且我驗證了通過調試找到的代碼。 任何幫助表示贊賞:

<Grid DataContext="{Binding Source={StaticResource VM}}">
    <Grid.Resources>
        <local:TotalSumConverter x:Key="sumConverter" />
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <DataGrid x:Name="myGrid" AutoGenerateColumns="False" ItemsSource="{Binding TrsFundDocItems,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Amount,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Amount"/>
            <DataGridTextColumn Binding="{Binding FCAmount,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="FCAmount"/>
        </DataGrid.Columns>
    </DataGrid>
    <Grid Grid.RowSpan="2">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="auto"/>
        </Grid.ColumnDefinitions>
        <Grid Grid.Row="1" Grid.Column="1" Margin="8">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto"/>
                <ColumnDefinition  Width="auto"/>
                <ColumnDefinition  Width="auto"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="SumTotal :" Grid.Row="0" Grid.Column="0"/>


            <TextBox Grid.Row="0" Grid.Column="1"  Text="{Binding ItemsSource, ConverterParameter=Amount, Converter={StaticResource sumConverter}, ElementName=myGrid, FallbackValue=0, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

        </Grid>
    </Grid>
    </Grid>

這是我的視圖模型:

public class WindowxViewModel : INotifyPropertyChanged
{
    public WindowxViewModel()
    {
        TrsFundDocItems = new ObservableCollection<TrsFundDocItem> { new TrsFundDocItem { Amount = 10, FCAmount = 1 }, new TrsFundDocItem { Amount = 5, FCAmount = 8 } };
    }


    private ObservableCollection<TrsFundDocItem> _TrsFundDocItems;

    public ObservableCollection<TrsFundDocItem> TrsFundDocItems
    {
        get { return _TrsFundDocItems; }
        set
        {
            if (_TrsFundDocItems == value) return;
            _TrsFundDocItems = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(TrsFundDocItems)));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
}

轉換器:

////////////////
    public class TotalSumConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var users = value as IEnumerable<object>;
            if (users == null)
                return "$0.00";

            double sum = 0;

            foreach (var u in users)
            {
                sum += ((TrsFundDocItem)u).Amount;
            }


            return sum.ToString("c");
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return 0;
        }
    }

實體 :

   public class TrsFundDocItem:INotifyPropertyChanged
    {
        //public double Amount { get; set; }
        private double amount;

        public double Amount
        {
            get { return amount; }
            set {
                if (amount == value) return;
                amount = value;
                PropertyChanged(this, new PropertyChangedEventArgs(nameof(Amount)));
            }
        }

        public double FCAmount { get; set; }

        public event PropertyChangedEventHandler PropertyChanged=delegate { };
    }

當您編輯單元格時,ItemsSource不會更新。 這就是為什么TextBox綁定不起作用的原因。 將TotalAmount屬性和Update方法添加到WindowxViewModel

    public string TotalAmount
    {
        get { return _totalAmount; }
        set
        {
            if (_totalAmount == value) return;
            _totalAmount = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(TotalAmount)));
        }
    }

    private void UpdateAmount()
    {
        double sum = 0;

        foreach (var u in TrsFundDocItems)
        {
            sum += u.Amount;
        }


        TotalAmount = sum.ToString("c");
    }

將UpdateAmount方法傳遞給TrsFundDocItem:

public class TrsFundDocItem : INotifyPropertyChanged
{
    private readonly Action _updateAction;

    //public double Amount { get; set; }
    private double amount;

    public TrsFundDocItem(Action updateAction)
    {
        _updateAction = updateAction;
    }
    public double Amount
    {
        get { return amount; }
        set
        {
            if (amount == value) return;
            amount = value;
            PropertyChanged(this, new PropertyChangedEventArgs(nameof(Amount)));
            _updateAction();
        }
    }

    public double FCAmount { get; set; }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
}

更新綁定:

<TextBox Grid.Row="0" Grid.Column="1"  Text="{Binding TotalAmount, FallbackValue=0, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM