DataGrid - jak przekazywac zaznaczone elementy do innego DataGrid

0

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.

0

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

0

Potrzebuje czegos co mi zwroci ten wiersz bo musze na nim wykonac jakas logike przed wrzuceniem/wyrzuceniem z DataGrid2

0

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

0

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.

0

@kalimata:

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)

0

@AnyKtokolwiek: trzymam zaznaczone wiersze w ViewModelu i tę właściwość binduję w drugiej tabeli jako źródło danych dla niej.

0

@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

0

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; }
    }
}

screenshot-20210813145802.png

0

@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}"

1 użytkowników online, w tym zalogowanych: 0, gości: 1