Laden...

System.InvalidOperationException: ""EditItem" ist für diese Ansicht nicht zulässig."

Erstellt von ToXiT vor 3 Jahren Letzter Beitrag vor 3 Jahren 921 Views
T
ToXiT Themenstarter:in
2 Beiträge seit 2021
vor 3 Jahren
System.InvalidOperationException: ""EditItem" ist für diese Ansicht nicht zulässig."

Hallo zusammen,
ich bzw. wir arbeiten an einer CAD (Computer Aided Dispatch) Software für eine Police RP Community.
In einer Eingabemaske sollen die Einsatzdaten (Straße, Stadt, Alarmstichwort, etc.) eingegeben werden. Dies geschieht über Textboxen und Comboboxen. Die Daten für die Combobox sind in einer eigenen .cs Datei gespeichert.

Die Daten sind im folgenden etwas gekürzt um es übersichtlicher zu halten.
Sources.cs


  public class Sources
    {
        public List<string> Cities { get; set; }
        public List<string> Street { get; set; }
        public List<string> Ten_Code { get; set; }
        public List<string> Prio { get; set; }

        public List<string> Buttons_Units { get; set; }


        public Sources()
        {
            Cities = new List<string>()
            {
            "Sandy Shores",
            "Chumash",
            "Grapeseed",
            "Harmony",
            "Los Santos",
            "North Chumash",
            "Paleto Bay"
        };

            Street = new List<string>()
            {
                "Abattoir Avenue",
                "Abe Milton Parkway",
                "Ace Jones Drive",
                "Adam's Apple Boulevard",
                "Aguja Street",
                "Alta Place",
                "Alta Street",
                "Amarillo Vista",
                "Amarillo Way",
                "Americano Way",
                "Atlee Street",
                "Autopia Parkway",
                "Banham Canyon Drive",
                "Barbareno Road",
                "Bay City Avenue",
                "Bay City Incline"
            };

            Ten_Code = new List<string>()
            {
                "10-13 -  Suspicious call",
                "10-14 -  Supicious subject",
                "10-16 -  Domestic Violence",
                "10-17 -  Mugging",
                "10-18 -  Wanted Person has been traced",
                "10-19 -  Breach of Peace"
            };

            Prio = new List<string>()
            {
                "1",
                "2",
                "3"
            };

        }

    }


Wenn alle Daten eingeben sind wird über den Button "Anlegen" alles in ein Datagrid gespeichert. Soweit so gut. Wenn mann nun einen Eintrag im DataGrid durch Doppelklick bearbeiten möchte, crasht das Programm und folgender Fehler wird ausgegben: > Fehlermeldung:

System.InvalidOperationException: ""EditItem" ist für diese Ansicht nicht zulässig."

Nach tagelanger Google- und Forensuche komme ich dem Problem nicht wirklich näher. Ich habe bisher herausgefunden, dass die ItemsSource nicht bearbeitet werden kann. Aber ich habe absolut keine Ahnung wie man es anders löst. 😦

Im folgenden noch der restliche (relevante) Code.
Bitte beachtet, dass wir absolut keine "Profi-Coder" sind. Daher seit bitte etwas nachsichtig mit uns. 😄

**MainWindow.xaml.cs[/b]


public partial class MainWindow : Window
    {
        private byte _btnValue;

        public MainWindow()
        {
            InitializeComponent();

            //Zugriff auf Datenquellen in sources.cs
            DataContext = new Sources();
 
        }


        //Speichern bzw. Anlegen des Einsatzes in der Tabelle
        private void Button_Click(object sender, RoutedEventArgs e)
        {
           
            Einsatzliste.Items.Add(new { Postal = textboxPostal.Text, Street = comboStrasse.SelectedItem, CrossStreet = comboKreuzung.SelectedItem, City = comboStadt.SelectedItem, Ten_Code = comboTenCode.SelectedItem, Prio = comboPrio.SelectedItem, Beschreibung = textboxBeschreibung.Text });
            textboxPostal.Clear();
            comboStrasse.Text = "";
            comboKreuzung.Text = "";
            comboStadt.Text = "";
            comboTenCode.Text = "";
            comboPrio.Text = "";
            textboxBeschreibung.Clear();

        }


MainWindow.xaml
Aus Gründen der Übersichtlichkeit sind hier exemplarisch nur zwei Comboboxen dargestellt.


<Window x:Class="Dispatch.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:Dispatch"
        mc:Ignorable="d"
        Title="Streife Gaming CAD" Height="1200" Width="1800">
    <Grid>

        <Label Margin="10,0,0,0" Grid.Row="1">Straße</Label>
        <ComboBox IsEditable="True" x:Name="comboStrasse" Margin="10,0,0,0" Grid.Row="2" ItemsSource="{Binding Street}">
        </ComboBox>

        <Label Grid.Row="4" Grid.Column="1" Margin="36,0,0,0" Grid.ColumnSpan="2">Stadt</Label>
        <Border Grid.Row="5" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" Grid.ColumnSpan="2" Height="30">
            <StackPanel Height="30" Margin="40,0,0,0" Orientation="Horizontal">
                <ComboBox x:Name="comboStadt" ItemsSource="{Binding Cities}" Width="200" IsEditable="True">

                </ComboBox>
            </StackPanel>
        </Border>

      
        <ComboBox x:Name="comboTenCode" Margin="10,0,0,0" Grid.Row="9" IsEditable="True" ItemsSource="{Binding Ten_Code}">

        </ComboBox>

        <!--Tablle-->
        <DataGrid x:Name="Einsatzliste" Grid.Column="2" HorizontalAlignment="Left" Height="908" Margin="60,0,-695,-323" Grid.RowSpan="15" VerticalAlignment="Top" Width="790" Grid.Row="1">
            <!--Aussehen der Tablle-->
            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <Setter Property="Background" Value="LightGray"/>
                    <Setter Property="BorderThickness" Value="0,0,1,2"/>
                    <Setter Property="BorderBrush" Value="Black"/>
                </Style>
            </DataGrid.Resources>

            <!--Überschriften der Spalten-->
            <DataGrid.Columns>
                <DataGridTextColumn Header="ID" Binding="{Binding Call_ID}" IsReadOnly="True" />
                <DataGridTextColumn Header="Postal" Binding ="{Binding Postal, UpdateSourceTrigger=PropertyChanged}" Width="40" IsReadOnly="False"/>
                <DataGridTextColumn Header="Straße" Binding="{Binding Street, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False"/>
                <DataGridTextColumn Header="Kreuzung" Binding="{Binding CrossStreet, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False"/>
                <DataGridTextColumn Header="Stadt" Binding="{Binding City, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False"/>
                <DataGridTextColumn Header="Ten-Code" Binding="{Binding Ten_Code, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False"/>
                <DataGridTextColumn Header="Priorität" Binding="{Binding Prio, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="False"/>
                <DataGridTextColumn Header="Einsatzbeschreibung" Binding="{Binding Beschreibung, UpdateSourceTrigger=PropertyChanged}" Width="*" IsReadOnly="False"/>
            </DataGrid.Columns>
        </DataGrid>

    </Grid>




</Window>



Vielen Dank schon mal für eure Hilfe. Falls ihr noch etwas braucht, dann meldet euch.

Viele Grüße

F
10.010 Beiträge seit 2004
vor 3 Jahren

Das ist die vollkommen falsche Herangehensweise.

[Artikel] MVVM und DataBinding

WPF ist für MVVM designed.

G
180 Beiträge seit 2015
vor 3 Jahren

Hallo ToXit,

ich trage jetzt zwar Säulen nach Athen (denn die einzig richtige Antwort hat FZelle schon gegeben), aber ich sehe hier schweren "System-Missbrauch"!

Was ihr umsetzen möchtet ist das Hinzufügen eines Eintrages unter XAML, der bei Verwendung von MVVM eine reine Routineeinstellung ist - durch Code-behind und das direkte ansprechen von Controls aber zum Ding der Unmöglichkeit wird!

Aber im Prinzip ließe sich das noch einfach umsetzen, indem du/ihr zuerst eine View (das eigentliche UserControl oder Window) erstellt und dann ein Model für diese View (ein ViewModel) --> das ist dann eine .cs-Datei, die sich um die Logik der Darstellung kümmert.

Um überhaupt mal ein Gespür dafür zu bekommen, würde ich vorschlagen sich mal in Grundzügen mit dem Bezug zwischen View und ViewModel auseinander zu setzen. Ich habe hier schon oft gelesen, das sei schwer, umständlich, kompliziert, aufwendig u. ä. Dem kann ich mich nicht anschließen.

Daher hier ein kleiner Kick-Start:

  1. Lege in deinem Projekt eine Datei an nach dem Schema (MyControlName)ViewModel --> z. B. MainWindowViewModel

  2. Dein ViewModel muss INotifyPropertyChanged implementieren, z.B. so:

public class MainWindowViewModel: INotifyPropertyChanged

  1. Im XAML-Code deiner View (z. B. MainWindow.xaml) fügst du folgenden Code hinzu:
<Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>

Fertig 😃 Du hast nun ein ViewModel, das mit deiner View verbunden ist.

Für deinen Fall erstellst du nun eine ObservableCollection<Sources> MyCollection. Und im DataGrid deiner View legst du diese Collection als ItemsSource fest:

<DataGrid ItemsSource="{Binding MyCollection}"

Und wir sind da...

Kleiner Tipp noch: Sources ist bei dir eine Liste von Listen. Kann man machen, wird aber sehr unübersichtlich; mir ist nicht ganz klar, wie alle diese Infos in ein und dasselbe DataGrid sollen. Es könnte also durchaus Sinn machen entweder das Sources-Objekt anders zu konzipieren (denkt auch an entsprechende Properties) oder mehrere Collections anzulegen, etwa für ComboBoxZellen im Grid.

Ich habe bisher herausgefunden, dass die ItemsSource nicht bearbeitet werden kann.

Wo immer du das herausgefunden hast - das ist komplett falsch! Genau für diesen Fall hast du die ItemsSource und DataBinding...und MVVM.

Gruß
Vorph

F
10.010 Beiträge seit 2004
vor 3 Jahren

Und noch etwas, warum schreibt ihr die Daten in den Sourcecode und nicht in eine Datenvank/XML-Datei/JSON-Datei?

So müsst ihr immer das alles neu compilieren, wenn sich Daten ändern, das macht man nicht.

T
ToXiT Themenstarter:in
2 Beiträge seit 2021
vor 3 Jahren

Hallo,

sorry für meine späte Rückmeldung. War beruflich die letzten Tage gebunden. Daher hatte ich noch nicht die Zeit, mir eure Antworten genau durchzulesen. Das werde ich jetzt machen. Ich bedanke mich aber herzlich bei euch (FZelle und GeneVorph) für eure Hilfe.

Viele Grüße und schönes Restwochenende
ToXiT