web-dev-qa-db-ger.com

Wie kann ich eine Liste von Zeichenfolgen in WPF / WP7 an eine ListBox binden?

Ich versuche, eine Liste von Zeichenfolgenwerten an ein Listenfeld zu binden, damit deren Werte zeilenweise aufgelistet werden. Im Moment benutze ich das:

<ListBox Margin="20" ItemsSource="{Binding Path=PersonNames}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Id}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Aber ich weiß nicht, was ich anstelle von Id in den Textblock schreiben soll, da es sich bei allen um Zeichenfolgenwerte handelt, nicht um benutzerdefinierte Klassen.

Außerdem beschwert es sich, dass ich die Personennamen nicht finden muss, wenn ich sie in MainPage habe, als MainPage.PersonNames.

Ich setze den Datenkontext auf:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Mache ich es falsch

61
Joan Venge

Wenn Sie einfach sagen, dass Ihre ItemsSource folgendermaßen gebunden ist:

YourListBox.ItemsSource = new List<String> { "One", "Two", "Three" };

Ihre XAML sollte wie folgt aussehen:

<ListBox Margin="20" Name="YourListBox">
    <ListBox.ItemTemplate> 
        <DataTemplate> 
            <StackPanel Orientation="Horizontal"> 
                <TextBlock Text="{Binding}" /> 
            </StackPanel> 
        </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

pdate:

Dies ist eine Lösung, wenn ein DataContext verwendet wird. Der folgende Code ist das Ansichtsmodell, das Sie an den DataContext der Seite und die Einstellung des DataContext übergeben:

public class MyViewModel
{
    public List<String> Items
    {
        get { return new List<String> { "One", "Two", "Three" }; }
    }
}

//This can be done in the Loaded event of the page:
DataContext = new MyViewModel();

Ihre XAML sieht jetzt so aus:

<ListBox Margin="20" ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Der Vorteil dieses Ansatzes besteht darin, dass Sie viel mehr Eigenschaften oder komplexe Objekte in die MyViewModel-Klasse einfügen und in die XAML extrahieren können. So übergeben Sie beispielsweise eine Liste von Personenobjekten:

public class ViewModel
{
    public List<Person> Items
    {
        get
        {
            return new List<Person>
            {
                new Person { Name = "P1", Age = 1 },
                new Person { Name = "P2", Age = 2 }
            };
        }
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Und die XAML:

<ListBox Margin="20" ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Name}" />
                <TextBlock Text="{Binding Path=Age}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Hoffe das hilft! :)

133
Abbas

Sie sollten uns den Code für Personennamen zeigen, und ich bin nicht sicher, ich verstehe Ihre Frage, aber vielleicht möchten Sie ihn so binden:

<TextBlock Text="{Binding Path=.}"/>

oder

<TextBlock Text="{Binding"} />

Dies wird an das aktuelle Element in der Liste gebunden. (Angenommen, PersonNames ist eine Liste von Zeichenfolgen.) Andernfalls wird der Klassenname in der Liste angezeigt

16
mindandmedia

Wenn die Elementquelle als Zeichenfolgeneinträge aufgelistet werden kann, verwenden Sie Folgendes:

<TextBlock Text="{Binding}"></TextBlock> 

Sie können diese Syntax für jedes Objekt verwenden. Im Allgemeinen wird dann die ToString () -Methode aufgerufen, um den Wert abzurufen. Dies ist in vielen Fällen sehr praktisch. Beachten Sie jedoch, dass keine Änderungsbenachrichtigung erfolgt.

9
HCL

Sie können dies tun, ohne das TextBlock-Steuerelement explizit als Teil Ihrer ListBox definieren zu müssen (sofern Sie keine bessere Formatierung wünschen). Der Trick, um die Bindung zum Auslösen zu bringen, ist die Verwendung eines ObservableCollection<string> anstatt List<string>

Window1.xaml

<ListView Width="250" Height="50" ItemsSource="{Binding MyListViewBinding}"/>

Window1.xaml.cs

public Window1()
{
   InitializeComponent();
   DataContext = this;

   // Need to initialize this, otherwise you get a null exception
   MyListViewBinding = new ObservableCollection<string>();
}

public ObservableCollection<string> MyListViewBinding { get; set; }

// Add an item to the list        
private void Button_Click_Add(object sender, RoutedEventArgs e)
{
   // Custom control for entering a single string
   SingleEntryDialog _Dlg = new SingleEntryDialog();

   // OutputBox is a string property of the custom control
   if ((bool)_Dlg.ShowDialog())
      MyListViewBinding.Add(_Dlg.OutputBox.Trim());
}
2
Kevin K