Forum: PC-Programmierung C# wpF MVVM Datagrid Problem


von Stefan (Gast)


Lesenswert?

Hallo zusammen,

ich versuche mich gerade etwas in C# WPF MVVM und habe ein Problem. Ich 
möchte eine Zeile auswählen und mit Hilfe von Contextmenu eine Message 
anzeigen. Mit dem Inhalt:
1. welche Zeile ausgewählt wurde
2. was ist der Inhalt der ersten Spalte von dieser Zeile?
Ich habe schon Stunden verbracht, um eine Lösung zu finden und komme mit 
keiner der Vorschläge zu recht.

Kann mir einer helfen und sagen wie ich das machen kann? Hier ist mein 
Code:

XAML- Code
1
     <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" IsReadOnly="True" Margin="5,50,5,25">
2
            <DataGrid.Columns>
3
                <DataGridTextColumn Header="number" Binding="{Binding number}"/>
4
                <DataGridTextColumn Header="name" Binding="{Binding name}"/>
5
            </DataGrid.Columns>
6
            <DataGrid.ContextMenu>
7
                <ContextMenu >
8
                    <MenuItem Header="open customer" Command="{Binding Path=OpenCustomerCommand}"/>
9
                </ContextMenu>
10
            </DataGrid.ContextMenu>
11
        </DataGrid>

ViewModel- Code
1
    class CustomerOverviewViewModel : DependencyObject
2
    {
3
        public ICommand OpenCustomerCommand { get; set; }
4
5
        public ICollectionView Items
6
        {
7
            get { return (ICollectionView)GetValue(ItemsProperty); }
8
            set { SetValue(ItemsProperty, value); }
9
        }
10
11
        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
12
        public static readonly DependencyProperty ItemsProperty =
13
            DependencyProperty.Register("Items", typeof(ICollectionView), typeof(CustomerOverviewViewModel), new PropertyMetadata(null));
14
15
        public CustomerOverviewViewModel()
16
        {
17
            OpenCustomerCommand = new RelayCommand(arg => OpenCustomerMethod());
18
            Items = CollectionViewSource.GetDefaultView(LinkToMySQL.GetDBData("customers"));
19
        }
20
21
        private void OpenCustomerMethod()
22
        {
23
24
            MessageBox.Show("selected row + name"); // hier soll die Aswahl angezeigt werden
25
        }
26
    }

ViewModel- Code
1
class LinkToMySQL
2
    {
3
        public static DataTable GetDBData(string DBtable)
4
        {
5
            string stringDB = ConfigurationManager.ConnectionStrings["MysqlConnectionString"].ConnectionString;
6
            DataTable dt = new DataTable();
7
            try
8
            {
9
                using (MySqlConnection myConn = new MySqlConnection(stringDB))
10
                {
11
                    MySqlCommand cmd = new MySqlCommand("select * FROM " + DBtable + "", myConn);
12
                    myConn.Open();
13
                    
14
                    dt.Load(cmd.ExecuteReader());
15
                    return dt;
16
                }
17
            }
18
            catch (Exception ex)
19
            {
20
                MessageBox.Show(ex.Message);
21
            }
22
            return dt;
23
        }
24
    }

von Thorsten (Gast)


Lesenswert?

Hi,

ich benutze dieses Tutorial, vielleicht hilft es Dir auch weiter

http://www.codingfreaks.de/2016/03/28/wpf-und-mvvm-richtig-einsetzen-teil-1/

von Frank (Gast)


Lesenswert?

Hallo Stefan,

wen Du in deinem ViewModel noch eine weiter Property einfügst und die 
vom DataGrid selektierte Zeile daran bindest, hast Du in 
OpenCustomerMethod Zugriff darauf.

ViewModel:
1
...
2
public object SelectedItem { get; set; } // Statt object am besten den konkreten Typ Deiner Daten nehmen (und bei Bedarf INotifyPropertyChanged umsetzen).
3
4
private void OpenCustomerMethod()
5
{
6
  MessageBox.Show("Selected: " + this.SelectedItem.Name);
7
}
8
...

XAML-Code:
1
<DataGrid ... SelectedItem="{Binding SelectedItem}">
2
  ...
3
</DataGrid>

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.