DataGrid 中更改的值未显示在 WPF 中
Value changed in DataGrid not display in WPF
我开发了一个 WPF 应用程序。我有一个带有 ObservableCollection 绑定到我的 DataGrid 的 DataGrid。在这个 ObservableCollection 中,我有一个对象和一个整数。
当我将 Integer 更新到 ObservableCollection 时,它并没有变成我的 DataGrid。
我的代码:
C#
private class MateriauxQte : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public t_materiaux materiaux { get; set; }
private int _QuantiteChantier;
public int QuantiteChantier {
get { return _QuantiteChantier; }
set
{
if (value != _QuantiteChantier)
{
_QuantiteChantier = value;
if (PropertyChanged != null) OnNotifyPropertyChanged("Quantite");
}
} }
private void OnNotifyPropertyChanged(string p)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(p));
}
public ImageSource Img { get; set; }
public MateriauxQte()
{
//Constructeur
materiaux = new t_materiaux();
QuantiteChantier = 0;
}
public MateriauxQte(t_materiaux m, int Qte = 0)
{
//Constructeur
materiaux = m;
if(materiaux.ID_IMAGE > -1)
{
c_image c_img = new CONTROLEUR.c_image();
t_image i = c_img.GetImage((int)materiaux.ID_IMAGE);
if (i.ID > 0 && i.IMAGE != null) Img = globale.DecodePhoto(i.IMAGE) as ImageSource;
}
QuantiteChantier = Qte;
}
public void Ajouter(int nbAjouter)
{
QuantiteChantier += nbAjouter;
}
public void Retirer(int nbRetirer)
{
QuantiteChantier -= nbRetirer;
}
}
private void AjouteUn(object sender, RoutedEventArgs e)
{
if (obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex].QuantiteChantier == 0)
{
obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex].Ajouter(1);
obsMateriauxChantier.Add(obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex]);
}
else { obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex].Ajouter(1); }
for (int o = 0; o < obsMateriauxChantier.Count; o++)
{
if (obsMateriauxChantier[o].materiaux.ID == obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex].materiaux.ID)
{
obsMateriauxChantier[o] = obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex];
break;
}
}
this.MajDataGrid(); //On met à jour le DataGrid
}
private void MajDataGrid()
{
this.t_materiauxDispoDataGrid.ItemsSource = obsMateriaux;
this.t_materiauxChantierDataGrid.ItemsSource = obsMateriauxChantier;
this.UpdateLayout();
}
XAML :
<DataGrid Grid.Column="0" x:Name="t_materiauxDispoDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding obsMateriaux}" RowDetailsVisibilityMode="VisibleWhenSelected">
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" x:Name="cODE_MDColumn" Binding="{Binding materiaux.CODE_MD}" Header="CODE MD" Width="100"/>
<DataGridTextColumn IsReadOnly="True" x:Name="lIBELLEColumn" Binding="{Binding materiaux.LIBELLE}" Header="LIBELLE" Width="150"/>
<DataGridTemplateColumn x:Name="iMAGEColumn" Header="IMAGE" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Img}" Height="100" Width="100" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn x:Name="nBColumn" Header="QUANTITE" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Button Name="BTN_MOINS" Content="-" Width="30" HorizontalAlignment="Left" Click="RetireUn"/>
<TextBox Name="SAI_QTE" FontSize="26" Text="{Binding QuantiteChantier}" Margin="35" KeyUp="SAI_QTE_KeyUp" KeyDown="SAI_QTE_KeyDown"/>
<Button Name="BTN_PLUS" Content="+" Width="30" HorizontalAlignment="Right" Click="AjouteUn"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
将 "UpdateSourceTrigger=PropertyChanged" 添加到绑定。
像这样:
<TextBox Name="SAI_QTE" FontSize="26" Text="{Binding QuantiteChantier, UpdateSourceTrigger=PropertyChanged}" Margin="35" KeyUp="SAI_QTE_KeyUp" KeyDown="SAI_QTE_KeyDown"/>
我开发了一个 WPF 应用程序。我有一个带有 ObservableCollection 绑定到我的 DataGrid 的 DataGrid。在这个 ObservableCollection 中,我有一个对象和一个整数。
当我将 Integer 更新到 ObservableCollection 时,它并没有变成我的 DataGrid。
我的代码:
C#
private class MateriauxQte : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public t_materiaux materiaux { get; set; }
private int _QuantiteChantier;
public int QuantiteChantier {
get { return _QuantiteChantier; }
set
{
if (value != _QuantiteChantier)
{
_QuantiteChantier = value;
if (PropertyChanged != null) OnNotifyPropertyChanged("Quantite");
}
} }
private void OnNotifyPropertyChanged(string p)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(p));
}
public ImageSource Img { get; set; }
public MateriauxQte()
{
//Constructeur
materiaux = new t_materiaux();
QuantiteChantier = 0;
}
public MateriauxQte(t_materiaux m, int Qte = 0)
{
//Constructeur
materiaux = m;
if(materiaux.ID_IMAGE > -1)
{
c_image c_img = new CONTROLEUR.c_image();
t_image i = c_img.GetImage((int)materiaux.ID_IMAGE);
if (i.ID > 0 && i.IMAGE != null) Img = globale.DecodePhoto(i.IMAGE) as ImageSource;
}
QuantiteChantier = Qte;
}
public void Ajouter(int nbAjouter)
{
QuantiteChantier += nbAjouter;
}
public void Retirer(int nbRetirer)
{
QuantiteChantier -= nbRetirer;
}
}
private void AjouteUn(object sender, RoutedEventArgs e)
{
if (obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex].QuantiteChantier == 0)
{
obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex].Ajouter(1);
obsMateriauxChantier.Add(obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex]);
}
else { obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex].Ajouter(1); }
for (int o = 0; o < obsMateriauxChantier.Count; o++)
{
if (obsMateriauxChantier[o].materiaux.ID == obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex].materiaux.ID)
{
obsMateriauxChantier[o] = obsMateriaux[this.t_materiauxDispoDataGrid.SelectedIndex];
break;
}
}
this.MajDataGrid(); //On met à jour le DataGrid
}
private void MajDataGrid()
{
this.t_materiauxDispoDataGrid.ItemsSource = obsMateriaux;
this.t_materiauxChantierDataGrid.ItemsSource = obsMateriauxChantier;
this.UpdateLayout();
}
XAML :
<DataGrid Grid.Column="0" x:Name="t_materiauxDispoDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding obsMateriaux}" RowDetailsVisibilityMode="VisibleWhenSelected">
<DataGrid.Columns>
<DataGridTextColumn IsReadOnly="True" x:Name="cODE_MDColumn" Binding="{Binding materiaux.CODE_MD}" Header="CODE MD" Width="100"/>
<DataGridTextColumn IsReadOnly="True" x:Name="lIBELLEColumn" Binding="{Binding materiaux.LIBELLE}" Header="LIBELLE" Width="150"/>
<DataGridTemplateColumn x:Name="iMAGEColumn" Header="IMAGE" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Img}" Height="100" Width="100" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn x:Name="nBColumn" Header="QUANTITE" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Button Name="BTN_MOINS" Content="-" Width="30" HorizontalAlignment="Left" Click="RetireUn"/>
<TextBox Name="SAI_QTE" FontSize="26" Text="{Binding QuantiteChantier}" Margin="35" KeyUp="SAI_QTE_KeyUp" KeyDown="SAI_QTE_KeyDown"/>
<Button Name="BTN_PLUS" Content="+" Width="30" HorizontalAlignment="Right" Click="AjouteUn"/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
将 "UpdateSourceTrigger=PropertyChanged" 添加到绑定。
像这样:
<TextBox Name="SAI_QTE" FontSize="26" Text="{Binding QuantiteChantier, UpdateSourceTrigger=PropertyChanged}" Margin="35" KeyUp="SAI_QTE_KeyUp" KeyDown="SAI_QTE_KeyDown"/>