2016-06-14 16 views
1

Das hat mich in den letzten zwei Wochen beunruhigt, ich versuche eine Liste zu erstellen, die ich aufrufen kann, um sie in einem WPF-Steuerelement zu verwenden. Ich kann den Code einfach nicht richtig verstehen.Erstellen einer Klasse zum Speichern einer Sammlung für die Datenbindung?

Ich habe Pro C# 5.0 and the .NET 4.5 Framework (Expert's Voice in .NET) und Kapitel 9 hat eine sehr detaillierte Beschreibung dessen, was sie sind und wie Sie sie verwenden. Aber zu meinen kleinen Fehlern kann ich nicht für das Leben von mir tun, was ich versuche zu tun.

Was ich versuche zu tun.

  • eine Klasse Erstellen Sie eine Liste von string Daten
  • verwenden, die ein WPF-Steuerelement (in diesem Beispiel ein Kombinationsfeld) aufzufüllen Liste zu halten über Datenbindung.
  • extrahieren Sie die aus der Liste ausgewählte Zeichenfolge.

Ich habe eine separate Klasse gemacht, es wird immer nur eine eindimensionale Liste BTW sein.

class CollectionClass 
    { 
     public static void ListOfStuff() 
     { 
      List<string> Stuff = new List<string>(); 
      Stuff.Add("Stuff1"); 
      Stuff.Add("Stuff2"); 
      Stuff.Add("Stuff3"); 
      Stuff.Add("Stuff4"); 
     } 
    } 

Und meine XAML für ein Kombinationsfeld,

<ComboBox Name="NamesComboBox" Background="Yellow" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="2" Margin="5" 
          DisplayMemberPath = "Value" SelectedValuePath="Key" 
          ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged, Path=Stuff}" 
          SelectedItem="{Binding UpdateSourceTrigger=PropertyChanged, Path=SelectedStuff}" 

Und die Methode aufzurufen,

CollectionClass.ListOfStuff(); 

Offensichtlich funktioniert dies nicht, so dass ich hoffte, dass jemand mir zeigen könnte in die richtige Richtung. Muss ich die method in der Main.xaml.cs anrufen?

+0

Es gibt keine einfache Antwort, weil Ihr Beispiel ist weit weg. Es gibt keinen einzigen Fix, Sie haben keine richtige Bindung, Sie haben kein Viewmodel, Ihre Methode hat keinen Rückgabetyp oder Sie speichern die Liste irgendwo ... Was Sie gerade haben, ist so weit von der Arbeit entfernt, dass ich nicht Ich schlage vor, dass Sie bei diesem Thema von vorne anfangen und ein gutes Buch oder eine Anleitung lesen und ihm folgen. – nvoigt

+0

@nvoigt, es ist in der Frage, ich versuche zu folgen, was in dem Buch Pro C# 5.0 und dem .NET 4.5 Framework (Expert's Voice in .NET) ist. Ich habe so oft von vorne angefangen. Offensichtlich ein Anfänger, aber ich brauche einen Punkt in die richtige Richtung, da ich hier alleine bin. – KyloRen

+0

Ich bin kein Spezialist für XAML, aber Sie sollten wahrscheinlich Stuff der Welt aussetzen;). Jetzt ist es nur innerhalb der ListOfStuff-Funktion vorhanden. – Logman

Antwort

1

Basierend auf data binding combobox in wpf

<Window x:Class="WpfApplication1.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:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <local:CollectionClass x:Key="StuffColl"/> 
    </Window.Resources> 

    <Grid> 
     <ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="164,137,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{Binding Stuff, Source={StaticResource StuffColl}}" SelectedIndex="0"/> 
    </Grid> 
</Window> 

und Klasse

public class CollectionClass 
{ 
    public List<string> Stuff { get; set; } 

    public CollectionClass() 
    { 
     Stuff = new List<string>(); 
     Stuff.Add("A"); 
     Stuff.Add("B"); 
     Stuff.Add("C"); 
     Stuff.Add("D"); 
    } 

} 
+0

Ehrfürchtig, das beantwortete alle meine Fragen. Ich konnte einfach nicht herumkommen, wie ich die "Sammlung" "ansammeln" und "einstellen" kann. Ihr Beispiel funktioniert in meiner Anwendung. – KyloRen

+0

Absolut genial, ich bin nun in der Lage, diese Daten mit anderen Steuerelementen wie Baumansicht usw. zu verbinden. Danke nochmal, das hilft enorm !!! – KyloRen

1

Die einfachste Art und Weise Ihrem Beispiel zu beheben ist:

XAML Raster wie folgt erstellen edit:

<Grid> 
<ComboBox Name="NamesComboBox" Background="Yellow" VerticalContentAlignment="Center" VerticalAlignment="Center" Margin="5" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged, Path=Value}"> 
</ComboBox> 
</Grid> 

dann ist dies die Datei xaml.cs wie bearbeiten

 public MainWindow() 
    { 
     ObservableCollection<string> Stuff = new ObservableCollection<string>(); 
     Stuff.Add("Stuff1"); 
     Stuff.Add("Stuff2"); 
     Stuff.Add("Stuff3"); 
     Stuff.Add("Stuff4"); 
     InitializeComponent(); 
     NamesComboBox.ItemsSource = Stuff;//here you set the itemsSource 
     NamesComboBox.SelectionChanged += NamesComboBoxOnSelectionChanged;// or you can create this on xaml like SelectionChanged="NamesComboBoxOnSelectionChanged" 
    } 

Schließlich Erstellen Sie die Methode

private void NamesComboBoxOnSelectionChanged(object sender, SelectionChangedEventArgs selectionChangedEventArgs) 
    { 
     var selectedString = selectionChangedEventArgs.AddedItems; 
    } 

Diese Variable enthält die Zeichenfolge, die Sie im Kombinationsfeld auswählen.

Es gibt viele Möglichkeiten, um Ihr Beispiel zu beheben, aber das scheint mir die schnellste

+0

Wie würden Sie diese Sammlung in eine separate Klasse stellen, um angerufen zu werden? Das ist, was ich wirklich Schwierigkeiten habe, richtig zu werden. – KyloRen

+0

Erstellen Sie eine separate Klasse, dann erstellen Sie eine Instanz in xaml.cs und dann füllen Sie diese Instanz – kimiko88

+0

Danke, ich werde es versuchen. – KyloRen

Verwandte Themen