Usuário com melhor resposta
Como modificar o conteúdo de uma celula baseado na alteração de outra.

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
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
//UI
public class MeuItem
{
public decimal Valor { get; set; }
public decimal Porcentagem { get; set; }
}
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
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
//UI
public class MeuItem
{
public decimal Valor { get; set; }
public decimal Porcentagem { get; set; }
}
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
-