So nebenbei fällt mir gerade ein ich muss .net 2 mal mitliefern. 32 und 64 bit Version
Das mit minimum SP für .net 2.0 ist eine gute Idee werde ich danach testen. Ich hoffe mal mehr als SP2 wird nicht gebraucht. Eine SP Installation liefere ich nämlich sicher nicht mit.
Aber das es für sowas von MS seite nichts gibt wundert mich etwas. Zumindest ab und zu müssen die ja vor änlichen Problemen stehen.
Das die Tastatur-Eingabe nicht flüssig ist, ist der Normalfall.
Öffne notepad und halte einfach mal 'x' oder so gedrückt - Da sieht man das Phänomen ebenfalls und ist da auch sinnvoll
Die Lösung:
- Bei KeyDown in nem Array die entsprechende Taste als gedrückt markieren
- Bei KeyUp in dem Array die Taste wieder als nicht-gedrückt markieren
- In nem Timer oder Thread oder sonstwie dann das Array abfragen, und die Aktionen ausführen die bisher bei KeyDown ausgeführt würden...
so
ich musste das problem der editable combobox nun auch loesen
das problem an der ganzen sache war das "SelectedItem" auf null geht sobald man text eingibt
um das zu loesen kann man Text binden
da war dann wieder das problem das SelectedItem null ist wenn Text neuer text war
man koennte nun entweder - wenn neuer text eingegeben wurde und die combobox verliert den focus den eintrag neu hinzu fuegen - am sonsten kann man sich einfach die letzte selektion merken und die dann neu setzen
hier meine funktionierende implementation:
public class Fruit
{
public string Name { get; set; }
}
public class FruitViewModel : ViewModelBase
{
public FruitViewModel(Fruit fruit)
{
Fruit = fruit;
}
public string Name
{
get { return Fruit.Name; }
set
{
Fruit.Name = value;
OnPropertyChanged(this, "Name");
}
}
public Fruit Fruit
{
get { return _fruit; }
set
{
_fruit= value;
OnPropertyChanged(this, "Fruit");
}
}
private Fruit _fruit;
public override string ToString()
{
return Name;
}
}
public class MainViewModel : ViewModelBase
{
public ObservableCollection<FruitViewModel> Fruits { get; set; }
public MainViewModel()
{
Fruits= new ObservableCollection<FruitViewModel>();
Fruits.Add(new FruitViewModel(new Fruit() { Name = "Banane" }));
Fruits.Add(new FruitViewModel(new Fruit() { Name = "Ananas" }));
Fruits.Add(new FruitViewModel(new Fruit() { Name = "Apfel" }));
SelectedUser = Fruits.FirstOrDefault();
}
public FruitViewModel SelectedFruit
{
get { return _selectedFruit; }
set
{
_selectedFruit = value;
if (_selectedFruit != null)
_oldSelectedFruit = _selectedFruit;
OnPropertyChanged(this, "SelectedFruit");
}
}
private FruitViewModel _selectedFruit;
private FruitViewModel _oldSelectedFruit;
public string NewFruitName
{
get { return _newFruitName; }
set
{
_newFruitName= value;
if (SelectedFruit == null)
_oldSelectedFruit.Name = _newFruitName;
OnPropertyChanged(this, "NewFruitName");
}
}
private string _newFruitName;
}
<!-- Wenn man das ItemTemplate nicht setzt wird wird die drop down liste nicht aktualisiert da es fuer "ToString()" kein PropertyChanged geben kann -->
<ComboBox ItemsSource="{Binding Fruits}" IsSynchronizedWithCurrentItem="True" IsEditable="True" Text="{Binding NewFruitName}" SelectedItem="{Binding SelectedFruit}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
als mvvm sicht betrachtet ist es n bissl eigenartig
denn dann waere "Foo" das model, und das model implementiert kein INotifyPropertyChanged
mein vorschlag waere:
public class Foo // model
{
public string Data { get; set; }
}
public class Bar : INotifyPropertyChanged // viewmodel
{
public Bar(Foo elem)
{
_elem = elem;
}
private Foo _elem;
public string Data
{
get { return elem.Data; }
set
{
elem.Data=value;
OnPropertyChanged("Data");
}
}
private void OnPropertyChanged(string property)
{
...
}
}
es kann aber natuerlich sein das du Foo irgendwo auch separat als viewmodel verwendest, dann stellt sich nur die frage wozu du dann Bar brauchst wenn du Foo direkt nehmen koenntest
//edit: tags vergessen
witte schrieb:
Und wenn du Form.ResizeEnd verwendest?
Das geht leider nicht, weil die Größe des Panels sich auch ändern kann, wenn die Form gleich groß bleibt. Wieso hat das Panel kein ResizeEnd?
BangBummm schrieb:
über Reflection kann man ja die Struktur/Aufbau und Typen von Methoden**,** Members und Properties etc. einer Klasse durchleuchten**.** Gibt es ne Möglichkeit einer vorhanden Klasse ein neues Property dynmaisch hinzufügen zur Laufzeit?
Rechtschreibung, Freund.
Und: nein, Klassen in .NET sind "statisch".
Du kannst dynamisch eine Assembly mit neuen Klassen erstellen, und die dann laden, aber du kannst bestehende nicht modifizieren.
Bis auf den letzten Punkt hast du alles richtig erfasst. Dazu hat ja witte schon was geschrieben. Wenn Referenzen in der Struktur sind, dann werden diese nicht tief kopiert. Es wird das kopiert was aufm Stack ist, und das sind nunmal nur die Referenzen, nicht die eigentlichen Objekte wo die Referenzen drauf verweisen.
Noch was zu den ersten beiden Punkten:
Klassen sind IMMER referenztypen...
Structe sind IMMER Valuetypen...
Das kann man sooo nicht sagen. Man kann problemlos Klassen von ValueType ableiten, so wie Enum es macht und schon ist es ein Valuetype obwohl formal "class" dasteht. Das ist eigentlich das wichtige in .Net: Ist es von ValueType abgeleitet oder nicht. Falls nein, ist es ein Referenztyp, falls ja, ist es ein ValueType. Wenn man das class Schlüsselwort verwendet wird ja implizit von Object abgeleitet, wenn struct als Schlüsselwort verwendet wird, wird implizit von ValueType abgeleitet.
Danke schön, für dieses gutes Beispiel. Ich habe C# nicht wirklich gelernt, ich dachte ich könnte mein wissen von C++ übernehemen für C#!
Gruss Patrick
Oh. Ich schwörs bei mir wars Englisch... Sorry und Danke, ich denke das ist gut investiertes Geld!
Danke Euch allen, wenn ich Probleme habe, weiss ich wo ich mich mit meiner konkreten und umfassenden Fragestellung hinwenden kann
lg daniel
Edit: ich schwör gar nix mehr, bei mir ist es auf einmal auch direkt die deutsche... bin heute iwi... verwirrt