Cześć, mam problem z przekazywaniem zaznaczenia/odznaczenia z jednego DataGrida do drugiego.
Na starcie aplikacji w DataGrid1 mam kilka wierszy, DataGrid2 jest pusty. Chciałem zeby zaznaczone wiersze z DataGrid1 pojawiały się w DataGrid2, ale również jak odznaczam jakis wiersz w DataGrid1 to zeby znikał również z DataGrid2. W DataGrid1 mam ustawiony tryb zaznaczania wielu wierszy.
Problem mam taki, że udało mi się uzyskać funkcjonalność zaznaczania, ale mam problem z odznaczaniem. Gdy w DataGrid1 zaznacze np 3 wiersze i chcę odznaczyc ostatnio zaznaczony (czyli np 3) to nic sie nie dzieje, ale jesli odznacze inny niż ostatnio zaznaczony to prawidłowo znika on z DataGrid2. O co tu chodzi? Jesli próbuje odznaczyć ostatnio zaznaczony wiersz to nie odpala się nawet właściwość bindowana do CurrentItem.
Hej
to moze dodaj sobie kolumnie select z checkbox'em.. i potem w zdarzeniu CheckBoxMultiRowSelection_CheckedChanged sprawdzasz co masz zaznaczone.. co będziesz mial to przekazujesz do DataGrid2
Potrzebuje czegos co mi zwroci ten wiersz bo musze na nim wykonac jakas logike przed wrzuceniem/wyrzuceniem z DataGrid2
hej
no to masz dwa wyjścia.. z zaznaczonego row'a pobierasz id z którym juz latwo pobrać resztę danych ze źródła DataGrid1.. albo zaznaczone rekordy pobierasz.. wykonac jakas logike i dopiero wpisujesz do
DataGrid2
Problem jest z odznaczaniem, bo jak mam już w DataGrid1 zaznaczone wiersze i chce odznaczyć ostatni wiersz który wcześniej dodałem, to podświetlenie wiersza znika, ale nie jest jakby nie jest wykonywana akcja ze wybrałem ten wiersz, nie ma w tym momencie bindowania. A jak wybiorę inny wiersz niż dodany jako ostatni to wszystko jest Ok.
temat by w ogółe nie istniał, jakby dane były wydzielone do Modelu, przybindowane do gridów, drugi przez property która filtruje dane posiadające "fajkę", pierwszy wszystkie
Grzebanie w danych grida, traktowanie jako kontener danych, skopie ...ę przy wzroście projektu
https://www.google.com/search?client=firefox-b-d&q=wpf+refresh+grid+from+viewmodel
https://docs.microsoft.com/en-us/answers/questions/362834/wpf-mvvm-observablecollection-doesn39t-update-list.html ( PeterFleischer-3316 wygląda, że działa rozsądnie, a nie strzela na oślep)
@AnyKtokolwiek: trzymam zaznaczone wiersze w ViewModelu i tę właściwość binduję w drugiej tabeli jako źródło danych dla niej.
@AnyKtokolwiek: mniej więcej właśnie tak się dzieje, tylko chodzi o to odznaczanie, że odznaczając ostatnio zaznaczony element, DataGrid już nie informuje zbindowanej do CurrentItem właściwości. Ale jesli odznacze jakis wiersz ktory nie był wybierany jako ostatni, to to powieadomienie od UI już idzie. — kalimata 22 minuty temu
Czyli jakby zmiana wiersza bieżącego pomagała ... jakby "flush" na innym poziomie ... hmmm
Twoja klasa wiersz przestrzega tego wzorca?
https://stackoverflow.com/questions/22897092/update-cell-in-datagrid-wpf
przy czym zaakceptowana odp jest mierna, chodzi o tą z punktami
Najprościej to zrobić tak:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.DataContext>
<local:MainWindowViewModel x:Name="hViewModel"/>
</Grid.DataContext>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<DataGrid x:Name="hData" ItemsSource="{Binding Path=Persons}" SelectionMode="Extended">
</DataGrid>
<DataGrid Grid.Column="1" ItemsSource="{Binding ElementName=hData, Path=SelectedItems}">
</DataGrid>
</Grid>
</Window>
namespace WpfApp1
{
public class MainWindowViewModel : INotifyPropertyChanged
{
#region PropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
#endregion
public MainWindowViewModel()
{
Persons.Add(new Person() { Id = 0, FirstName = "Adam", LastName = "Adamowski" });
Persons.Add(new Person() { Id = 1, FirstName = "Łukasz", LastName = "Łukaszowski" });
Persons.Add(new Person() { Id = 2, FirstName = "Szymon", LastName = "Szymański" });
Persons.Add(new Person() { Id = 3, FirstName = "Małgorzata", LastName = "Małgorzatna" });
Persons.Add(new Person() { Id = 4, FirstName = "Roman", LastName = "Romański" });
}
public IList<Person> Persons { get; set; } = new ObservableCollection<Person>();
}
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
@AnyKtokolwiek:
MainViewModel:
public class MainViewModel : ViewModelBase
{
public ICommand RowSelectedCommand { get; }
public MainViewModel()
{
RowSelectedCommand = new RowSelectedCommand(this);
}
private ObservableCollection<Employee> _employees;
public ObservableCollection<Employee> Employees
{
get {return _employees;}
set
{
_employees = value;
OnPropertyChanged(nameof(Employee));
}
}
private ObservableCollection<Employee> _selectedRows= new ObservableCollection<Employee>
{
new Employee{ Id=1, Name="Joe", Lastname="Doe", Age=60, DepartmentId="A-01"},
new Employee{ Id=2, Name="Andrew", Lastname="Williams", Age=43, DepartmentId="S-6"},
new Employee{ Id=3, Name="Ann", Lastname="Test", Age=30, DepartmentId="D-01"}
};
public ObservableCollection<Employee> SelectedRows
{
get { return _selectedRows; }
set
{
_selectedRows = value;
OnPropertyChanged(nameof(SelectedRows));
}
}
private Employee _currentItem;
public Employee CurrentItem
{
get { return _currentItem; }
set
{
_currentItem = value;
RowSelectedCommand.Execute(value);
OnPropertyChanged(nameof(CurrentItem));
}
}
private Employee _selectedItem;
public Employee SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
OnPropertyChanged(nameof(SelectedItem));
}
}
private int _selectedIndex = -1;
public int SelectedIndex
{
get { return _selectedIndex; }
set
{
_selectedIndex = value;
OnPropertyChanged(nameof(SelectedIndex));
}
}
}
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public virtual void Dispose() { }
}
RowSelectedCommand
public class RowSelectedCommand : ICommand
{
public MainViewModel _mainViewModel;
public event EventHandler CanExecuteChanged;
public RowSelectedCommand(MainViewModel mainViewModel)
{
_mainViewModel = mainViewModel;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
if (parameter is Employee employee)
{
if (employee.Age < 25)
return;
var emp = _mainViewModel.SelectedEmployees?.FirstOrDefault<Employee>(x => x.Id == employee.Id);
if (_mainViewModel.SelectedEmployees is null) _mainViewModel.SelectedEmployees = new System.Collections.ObjectModel.ObservableCollection<Employee>();
if (emp != null)
{
_mainViewModel.SelectedEmployees.Remove(emp);
}
else
{
_mainViewModel.SelectedEmployees.Add(employee);
}
}
}
a w widoku mam zbindowane
CurrentItem="{Binding CurrentItem, Mode=TwoWay}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"