none
Como modificar o conteúdo de uma celula baseado na alteração de outra. RRS feed

  • Pergunta

  • Boa tarde, estou precisando de uma ajuda referente a DataGrid.

    Eu preciso que uma célula tenha seu conteúdo alterado sempre que outra célula for modificada.

    Exemplo, eu tenho uma célula que guarda um %, quando o valor dela for modificado eu preciso recalcular o valor da célula seguinte (que guardar o valor refente ao %).

    Eu fiz assim, no evento Changed da célula % eu chamei uma rotina que faz o calculo e altera a propriedade no ItemSource. Porém quando eu atualizo o ItemSource o sistema entra em "Loop", porque o evento Changed da célula é chamado infinitivamente. Tentei fazer com GotFocus, mas acontece a mesma coisa.

    Alguém tem uma sugestão? Existe uma forma de eu alterar o conteúdo na célula diretamente na Grid? sem passar pelo ItemSource. Talvez com uma Trigger.

    Ou alguma outra forma de atualizar a coluna de valor sem utilizar o evento Changed.

    Obrigado

    Ricardo.


    Ricardo S. Pulini

    segunda-feira, 8 de maio de 2017 20:29

Respostas

  • Não sei exatamente o que precisa, mas montei um exemplo e alterar a partir disso.

    xaml:

    <Window x:Class="WpfApplication2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication2"
            Title="MainWindow" Height="350" Width="525"  Loaded="Window_Loaded">
        <Window.Resources>
            <local:CalculaPorcentagem x:Key="CalculaPorcentagem" />
        </Window.Resources>
        <Grid>

            <DataGrid x:Name="dtgValores" ItemsSource="{Binding}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Total" Binding="{Binding Path=Valor}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Total com %">
                        <DataGridTextColumn.Binding>
                            <MultiBinding Converter="{StaticResource CalculaPorcentagem}">
                                <Binding Path="Valor" />
                                <Binding Path="Porcentagem"/>
                            </MultiBinding>
                        </DataGridTextColumn.Binding>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="%" Binding="{Binding Path=Porcentagem}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                List<MeuItem> itens = new List<MeuItem>();
                itens.Add(new MeuItem() { Valor = 1000.00M, Porcentagem = 0.3M });
                itens.Add(new MeuItem() { Valor = 2000.00M, Porcentagem = 0.2M });
                itens.Add(new MeuItem() { Valor = 3000.00M, Porcentagem = 0.1M });

                DataContext = itens;
            }
        }

        //Itens supostamente da base
        public class MeuItem
        {
            public decimal Valor { get; set; }
            public decimal Porcentagem { get; set; }
        }

     //UI
        public class CalculaPorcentagem : IMultiValueConverter
        {


            public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (values[0] is decimal && values[1] is decimal)
                    return string.Format("{0}", (decimal)values[0] * (decimal)values[1]);
                return null;
            }

            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }

    • Marcado como Resposta Ricardo Pulini segunda-feira, 8 de maio de 2017 23:12
    segunda-feira, 8 de maio de 2017 22:09

Todas as Respostas

  • Não sei exatamente o que precisa, mas montei um exemplo e alterar a partir disso.

    xaml:

    <Window x:Class="WpfApplication2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication2"
            Title="MainWindow" Height="350" Width="525"  Loaded="Window_Loaded">
        <Window.Resources>
            <local:CalculaPorcentagem x:Key="CalculaPorcentagem" />
        </Window.Resources>
        <Grid>

            <DataGrid x:Name="dtgValores" ItemsSource="{Binding}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Total" Binding="{Binding Path=Valor}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Total com %">
                        <DataGridTextColumn.Binding>
                            <MultiBinding Converter="{StaticResource CalculaPorcentagem}">
                                <Binding Path="Valor" />
                                <Binding Path="Porcentagem"/>
                            </MultiBinding>
                        </DataGridTextColumn.Binding>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="%" Binding="{Binding Path=Porcentagem}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>

        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                List<MeuItem> itens = new List<MeuItem>();
                itens.Add(new MeuItem() { Valor = 1000.00M, Porcentagem = 0.3M });
                itens.Add(new MeuItem() { Valor = 2000.00M, Porcentagem = 0.2M });
                itens.Add(new MeuItem() { Valor = 3000.00M, Porcentagem = 0.1M });

                DataContext = itens;
            }
        }

        //Itens supostamente da base
        public class MeuItem
        {
            public decimal Valor { get; set; }
            public decimal Porcentagem { get; set; }
        }

     //UI
        public class CalculaPorcentagem : IMultiValueConverter
        {


            public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (values[0] is decimal && values[1] is decimal)
                    return string.Format("{0}", (decimal)values[0] * (decimal)values[1]);
                return null;
            }

            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }

    • Marcado como Resposta Ricardo Pulini segunda-feira, 8 de maio de 2017 23:12
    segunda-feira, 8 de maio de 2017 22:09
  • Olá Cesar Boa Noite!

    Muito obrigado, creio que isso resolva sim meu problema.

    Abraço.

    Ricardo


    Ricardo S. Pulini

    segunda-feira, 8 de maio de 2017 23:12