Hallo liebes Forum,
ich stehe mit meinem Programm vor einem kleinen Problem zu dem ich leider bisher keine Lösung finden konnte.
Ich habe wie folgt generiert wird:
code in der .xaml.cs datei:
List<SAListenelement> SAListe1 = new List<SAListenelement>();
for (x = 0; x < sacount; x++)
{
SAListe1.Add(new SAListenelement() { Title = saneu[x]});
}
LISTE1.ItemsSource = SAListe1;
code in der .xaml datei:
<ListBox Name="LISTE1" Margin="0,41,487.667,0.333">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="0,2">
<TextBlock Text="{Binding Title}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Die Darstellung der Liste und die Titelzuweisung der einzelnen Elemente funktionieren. Ich möchte nun, dass bei auswahl eines Listenelements nach Klick auf einen Button ein Ereignis getriggert wird.
Meine Idee
private void Button1_Click(object sender, RoutedEventArgs e)
{
if(LISTE1.SelectedItem[0] = true) {}
}
funktioniert leider nicht. Kann mir vielleicht jemand sagen wie ich die Bedingung für das if formulieren muss, damit gefragt wird ob(oder welches) ein Listenelement ausgewählt wurde
Hi,
du solltest dir noch mal anschauen, wie man das in WPF besser macht. Wenn du so weiter machen möchtest wie jetzt wäre in meinen Augen WindowsForms besser geeignet als WPF.
Wie man das richtig macht: [Artikel] MVVM und DataBinding
Abseits davon: Für C#-Code bitte C#-Tags benutzen - für XAML gibts XML-Tags - macht's übersichtlicher für die Leser - ich bezweifle nämlich, dass jemand versucht deinen Code so zu lesen...
Edit:
Ja der Beitrag ist kurz und auf den ersten Blick nicht direkt hilfreich - dennoch nicht bös gemeint - denn wer den Artikel liest und umsetzt wird schnell feststellen, dass dies die korrekte Art ist mit WPF zu arbeiten. Die Arbeit wie sie in WinForms oft gemacht wird - ist unter WPF schlicht nicht angebracht. Im Normalfall sollte auf diese Art das Problem nicht mehr auftauchen - und selbst wenn es das doch tut - kann man bei Anwendung von MVVM und CodeTags ernsthafte Hilfe erwarten und hat zusätzlich den Vorteil, dass es plötzlich ganz viele Tutorials gibt die zur eigenen Arbeit passen.
Hey Uff,
solche Antworten wie von Taipi88 hasse ich persönlich.
Ich kenne das, man versucht es ewig alleine, hat schon gegoogled und wendet sich dann hoffnungsvoll an ein Forum, um dort zu hören man sollte es anders machen.
Allerdings muss man in dem Fall sagen, er hat recht.
Du solltest wirklich auf das MVVM Pattern sowie auf DataBindings setzen, das macht die Sache wesentlich leichter und auch angenehmer damit zu arbeiten.
Ansonsten zu deiner Frage :
Theoretisch sollte LISTE1.SelectedItem != null dir sagen ob bereits ein Element ausgewählt wurde.
Grüße
Er verweist auf einen vorhandenen Einstieg Forumsintern, welcher Zeitintensiv von Freiwilligen erstellt worden ist, um genau Anfänger diese Hilfe zu bieten, ohne alles doppelt und 4869fach neu runterleiern zu müssen.
Ich nehme deine persönliche Meinung zur Kenntnis, dennoch sollte man mal darüber nachdenken.
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄
Sollte auch kein persönlicher Angriff sein und der Verweis darauf ist wie bereits erwähnt auch nicht verkehrt, allerdings beantwortet das seine Frage überhaupt nicht.
Grüße
Danke für eure Hilfen und Anregungen.
Theoretisch sollte LISTE1.SelectedItem != null dir sagen ob bereits ein Element ausgewählt wurde.
Das funktioniert auch, ich möchte jedoch abfragen WELCHES element ausgewählt wurde. Jedem Element wird ja ein anderer string "Title" zugewiesen, es muss also doch eine Möglichkeit geben zu unterscheiden welches Element ausgewählt wurde?
Vielen Dank.
In MVVM arbeitet man mit Databinding.
Das heisst, die ListBox bindet das selektierte Element auf eine Property im ViewModel.
Dazu muss die ListBox aber aus einer ItemSource leben.
Erster Google Treffer zu "mvvm listbox selecteditem" liefert mir folgendes Sample:
private ObservableCollection<DisneyCharacter> p_DisneyCharacters;
public ObservableCollection<DisneyCharacter> DisneyCharacters
{
get { return p_DisneyCharacters; }
set
{
p_DisneyCharacters = value;
base.FirePropertyChangedEvent("DisneyCharacters");
}
}
private DisneyCharacter p_SelectedItem;
public DisneyCharacter SelectedItem
{
get { return p_SelectedItem; }
set
{
p_SelectedItem = value;
base.FirePropertyChangedEvent("SelectedItem");
}
}
<ListBox ItemTemplate="{StaticResource MasterTemplate}"
ItemsSource="{Binding Path=DisneyCharacters}"
SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}"
HorizontalAlignment="Stretch" />
Dadurch hast Du im ViewModel dann eine Eigenschaft, die die Selektierung darstellt.
Willst Du auf DataBinding verzichten oder verzichtest aus anderen Gründen drauf, dann wirst Du von einem Workaround in den anderen Workaround stolpern.
WPF ist so konzipiert, dass MVVM maßgeblich zum Einsatz kommt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo,
und den Button dann auch nicht mit Click-Event im Code behind behandeln, sondern Command Binding benutzen und ein Command aus dem Viewmodel dran binden.
Dort ist dann wenn das SelectedItem richtig gebunden dasselbe schon bekannt und kann direkt verwendet werden.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca