WPF Datagrid frissítési probléma

WPF Datagrid frissítési probléma
2014-03-03T00:17:50+01:00
2014-03-05T00:33:07+01:00
2022-08-08T16:35:29+02:00
Syriuss
Sziasztok,

Van egy olyan problémám, hogy módosítani akarok egy datagrid adott oszlopában lévő értékeket gombnyomásra. A következő kóddal az adatot módosítom, de nem frissül a grid.

Ez fut le a gombra kattintáskor:

private void btMirrorX_Click(object sender, RoutedEventArgs e) { double Width; MainViewModel dc = DataContext as MainViewModel; if (dc != null) { Width = double.Parse(tbBoardWidth.Text, NumberStyles.AllowDecimalPoint, new CultureInfo("en-US")); foreach (PickListItem pli in dc.PickList.SourceCollection) { if (pli.Head != 10) { pli.X = Width - pli.X; } } DataContext = dc; } }

Tudom, hogy nem jól csinálom, de nem jövök rá, hogy hol a probléma.
A grid feltöltése:

while(text file olvasása){ <sorok konvertálása _Nr, _Head stb. változókba> lstPickList.Add(new PickListItem { Nr = _Nr, Head = _Head, Stack = _Stack, X = _X, Y = _Y, Angle = _Angle, Height = _Height, Skip = _Skip, Description = _Description, Comment = _Comment }); } DataContext = new MainViewModel(lstPickList);
MainViewModel:

class MainViewModel { public ICollectionView PickList { get; private set; } public MainViewModel(List<PickListItem> pli) { PickList = CollectionViewSource.GetDefaultView(pli); } }

PickList:

public class PickListItem : INotifyPropertyChanged { private int _Nr; private int _Head; private int _Stack; private double _X; private double _Y; private int _Angle; private double _H; private bool _Skip; private string _Description; private string _Comment; public int Nr { get { return _Nr; } set { _Nr = value; } } public int Head { get { return _Head; } set { _Head = value; NotifyPropertyChanged("Head"); } } public int Stack { get { return _Stack; } set { _Stack = value; NotifyPropertyChanged("Stack"); } } public double X { get { return _X; } set { _X = value; NotifyPropertyChanged("X"); } } public double Y { get { return _Y; } set { _Y = value; NotifyPropertyChanged("Y"); } } public int Angle { get { return _Angle; } set { _Angle = value; NotifyPropertyChanged("Angle"); } } public double Height { get { return _H; } set { _H = value; NotifyPropertyChanged("Height"); } } public bool Skip { get { return _Skip; } set { _Skip = value; NotifyPropertyChanged("Skip"); } } public string Description { get { return _Description; } set { _Description = value; NotifyPropertyChanged("Description"); } } public string Comment { get { return _Comment; } set { _Comment = value; NotifyPropertyChanged("Comment"); } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion #region Private Helpers private void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion }


XAML:

<DataGrid Grid.Column="1" Grid.Row="2" Name="lvPnpDataList" ItemsSource="{Binding PickList}" AutoGenerateColumns="False" AlternatingRowBackground="#ffebebeb"> <DataGrid.Columns> <DataGridTextColumn Header="Nr" Binding="{Binding Nr}" IsReadOnly="True" /> <DataGridTextColumn Header="Head" Binding="{Binding Head}"> <DataGridTextColumn.CellStyle> <Style> <Setter Property="FrameworkElement.HorizontalAlignment" Value="Right" /> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <DataGridTextColumn Header="Stack" Binding="{Binding Stack}"> <DataGridTextColumn.CellStyle> <Style> <Setter Property="FrameworkElement.HorizontalAlignment" Value="Right" /> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <DataGridTextColumn Header="X" Binding="{Binding Y, StringFormat={}{0:n2}}"> <DataGridTextColumn.CellStyle> <Style> <Setter Property="FrameworkElement.HorizontalAlignment" Value="Right" /> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <DataGridTextColumn Header="Y" Binding="{Binding Y, StringFormat={}{0:n2}}"> <DataGridTextColumn.CellStyle> <Style> <Setter Property="FrameworkElement.HorizontalAlignment" Value="Right" /> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <DataGridTextColumn Header="Angle" Binding="{Binding Angle}"> <DataGridTextColumn.CellStyle> <Style> <Setter Property="FrameworkElement.HorizontalAlignment" Value="Right" /> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <DataGridTextColumn Header="Height" Binding="{Binding Height, StringFormat={}{0:n2}}"> <DataGridTextColumn.CellStyle> <Style> <Setter Property="FrameworkElement.HorizontalAlignment" Value="Right" /> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <DataGridCheckBoxColumn Header="Skip" Binding="{Binding Skip}" /> <DataGridTextColumn Header="Description" Binding="{Binding Description}" IsReadOnly="True" /> <DataGridTextColumn Header="Comment" Binding="{Binding Comment}" IsReadOnly="True" /> </DataGrid.Columns> </DataGrid>

Van valakinek ötlete, hogyan kellene csinálni?

Köszönöm!
Mutasd a teljes hozzászólást!
Helló!

Ezt meg kéne debugolni a pontos válaszhoz, de ez a kétirányú adatmozgás:

MainViewModel dc = DataContext as MainViewModel;

azaz, hogy így olvasod be a változásokat a modelledbe, szvsz semmiképpen nem ajánlott.

Tehát láthatóan te azt szeretnéd, hogy megváltoztatod az UI-t, aztán "visszaszerzed" a DataContext-ből a modelledet. Ez nem tűnik okos megoldásnak, és könnyen lehet, hogy ezért nem is működik.

Nézd meg ezt az egyszerű MVVP pattern-t (letölthető forrással), hogyan köti az UI változásokat az adatmodellhez az ICommand interface használatával!

A ConverterControl.xaml-ban:

<Button Command="{Binding ConvertTextCommand}" Margin="5">Convert</Button>

A Presenter.cs-ben:

public ICommand ConvertTextCommand { get { return new DelegateCommand(ConvertText); } }

Ahol a ConvertText() metódus frissít egy ObservableCollection-t. Láthatod, hogy eseménykezelőt nem is használ a kód egyáltalán.

Ez az ajánlott módja a modelled frissítésének. Így teljesen független az UI az adatmodell-től.
Mutasd a teljes hozzászólást!

abcd