Hallo!
Ich dachte das wär was ganz Einfaches!
Ich möchte eine OC an ein DataGrid binden:
<DataGrid ItemsSource="{Binding MediaDateiBlacklist, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="False" CanUserAddRows="True" IsReadOnly="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Extension" Binding="{Binding Mode=TwoWay, Path=. }"/>
</DataGrid.Columns>
</DataGrid>
// VM Eigenschaft:
private ObservableCollection<string> _MediaDateiBlacklist;
/// <summary>
/// Liste der Datei-Extensionen die nicht! übernommen werden sollen.
/// </summary>
public ObservableCollection<string> MediaDateiBlacklist { get => _MediaDateiBlacklist; set { _MediaDateiBlacklist = value; OnChanged(nameof(MediaDateiBlacklist)); } }
// Initalisierung im Konstruktor des VM
public VMDateiSystem()
{
MediaDateiBlacklist = new();
MediaDateiBlacklist.Add(".exe");
MediaDateiBlacklist.Add(".zip");
MediaDateiBlacklist.Add(".doc");
MediaDateiBlacklist.Add(".inf");
}
Als erstes ist mir aufgefallen, das zur Laufzeit das DataGrid keine Leerzeile besitzt, so das ich keinen neuen Eintrag direkt (im DG) hinzufügen kann.
Als zweites musste ich feststellen, das ich zwar einen Wert direkt im DataGrid ändern kann, beim Verlassen des Eintrages wird aber der "Ursprungs-Wert" wiederhergestellt (Die Änderung unwirksam).
Wenn ich programmtechnisch (per Button) der OC einen neuen Eintrag hinzufüge wird dieser Eintrag im DataGrid zwar angezeigt, aber auch diesen Wert kann ich wieder nicht dauerhaft speichern. Beim Verlassen des Eintrags wird er (auf den Wert der programmtechnischen Zuweisung) zurückgesetzt.
Es wird werden weder ein Bindingsfehler noch eine Exception beim Ändern angezeigt/geworfen!
Wie bindet man korrekt eine OC an ein DataGrid?
Hinweis:
Wenn ich den Bindungs-Mode in der DataGridTextColumn nicht explizit angebe, wird beim Verlassen eines geänderten Eintrages die Exception:
System.InvalidOperationException: "Die bidirektionale Bindung erfordert "Path" oder "XPath"."
geworfen.
Hallo Blonder Hans
Danke für deine Antwort!
Diesen Beitrag hatte ich mir angesehen (daher das Binding={... Path=.} ) aber inhaltlich nicht beachtet (was auch nicht gezeigt wird)), dass man dann an eine List<T(Object)> binden muss und nicht List<T(Referenz)> benutzen kann. In diesem Beispiel hätte es ja List<StringWrapper> heißen müssen, damit man Binding={... Path=.} benutzen kann. Der Grund (string = Verweis-Typ deshalb Strings in Objekte einschließen und die Pfadeigenschaft für das Binding verwenden)) wurde ausführlich erklärt, man hätte aber auch einfach sagen können List<String> kann man nicht TwoWay binden.
Ich benutze jetzt eine OC<StringListenEintrag> und binde (wieder) an eine String-Eigenschaft über den Eigenschafts-Namen. (Standard)
public class StringListenEintrag
{
public string StringWert { get; set; }
public StringListenEintrag(string Wert)
{
StringWert = Wert;
}
}
<DataGrid ItemsSource="{Binding MediaDateiBlacklist}"
AutoGenerateColumns="False" CanUserAddRows="True" IsReadOnly="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Extension" Binding="{Binding StringWert}"/>
</DataGrid.Columns>
</DataGrid>
Was aber immer noch ist, die Leer-Zeile am Ende des DataGrid's wird mir nicht angezeigt. Ein anfügen eines Eintrages ist somit direkt im DataGrid nicht möglich.
Woran kann das den noch liegen?
Die zu bindende Klasse muß einen parameterlosen Konstruktor besitzen: Editable DataGrid - CanUserAddRows="True" not working
Hallo Th69!
Na das ist ja wieder mal ein Zusammenhang! Ich hatte im Vorfeld schon gesucht, aber unter DataGrid Eingabe-Zeile kamen keine verwertbaren Hinweise.
Mal wieder vielen Dank für deine Lösung!