2016-07-12 6 views
-3

Ich habe ein Objekt, das eine beobachtbare Sammlung von Strings enthält. Wie binde ich ein Datenraster, um diese Strings anzuzeigen?DataGrid an ObservableCollection von Strings in einem anderen Objekt binden

Nehmen Sie zum Beispiel:

public class Container 
{ 
    public ObservableCollection<string> strs; //This won't work, see edit! 
. 
. 
. 
} 

XAML:

<DataGrid ItemsSource="{Binding Container}" AutoGenerateColumns="False" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Strings" Binding="{Binding}" /> 
    </DataGrid.Columns> 
</Datagrid> 

Edit für die Suchende: Es gibt ein paar Dinge falsch mit dem obigen Ansatz, zunächst können Sie zu Eigenschaften von Elementen binden indem Sie einfach auf diese Eigenschaften verweisen. In diesem Fall:

ItemsSource="{Binding Container.strs}" 

Zweitens ist der Inhalt einer Zeichenfolge nicht eine Eigenschaft der Saite, so

Binding="{Binding}" 

Wird direkt an die Saite, anstatt zu versuchen, es ist Eigenschaften zu finden (wie als Länge)

Schließlich können Sie nicht an Felder binden, nur Eigenschaften, was ist der Unterschied?

public ObservableCollection<string> strs; //This is a field 
public ObservableCollection<string> strs {get; set;} //This is property 

Bonus: Wenn Sie gerade strs Instanziieren einmal dann wird der ObservableCollection mitteilen was auch immer seine Grenze, wenn geändert/in ihm auftreten, aber wenn Sie den Zeiger ändern wird es nicht, dieses Problem zu beheben Sie können eine Abhängigkeitseigenschaft verwenden!

in Visual Studio ist es am besten für diese den integrierten Code-Schnipsel zu verwenden, da es eine Menge Dinge, die in Art zu füllen: ‚propdp‘ ein und drückte zweimal Tab, in diesem Fall würden wir haben:

public ObservableCollection<string> strs 
    { 
     get { return (ObservableCollection<string>)GetValue(strsProperty); } 
     set { SetValue(strsProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for strs. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty strsProperty = 
     DependencyProperty.Register("strs", typeof(ObservableCollection<string>), typeof(Container), new PropertyMetadata("")); 

Antwort

1

Das hat für mich funktioniert.

XAML:

<Window x:Class="WpfApplication2.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:WpfApplication2" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 

     <DataGrid ItemsSource="{Binding thing.stuff}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Width="Auto" Header="String Contents" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

    </Grid> 
</Window> 

und Code hinter (C#):

using System.Windows; 
using System.Collections.ObjectModel; 

namespace WpfApplication2 
{ 
    public class Thing 
    { 
     // make sure this is a property, not a field. 
     // furthermore, make sure it is public. 
     public ObservableCollection<string> stuff 
     { 
      get; set; 
     } 

     public Thing() 
     { 
      stuff = new ObservableCollection<string>(); 
      stuff.Add("A String"); 
      stuff.Add("Another String"); 
      stuff.Add("Yet Another String"); 
     } 
    } 

    public partial class MainWindow : Window 
    { 
     public Thing thing{get;set;} 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = this; 
      thing = new Thing(); 
     } 
    } 
} 

ich Ihnen empfehlen Ihre Frage ein bisschen mehr Fleisch aus. Denken Sie daran, dass das Ziel von StackOverflow darin besteht, dass Fragen sowohl für andere Benutzer als auch für Sie hilfreich sind.

EDIT: knapper XAML

<Window x:Class="WpfApplication2.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:WpfApplication2" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 

     <DataGrid ItemsSource="{Binding thing.stuff}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Width="Auto" Binding="{Binding}" Header="String Contents" /> 
      </DataGrid.Columns> 
     </DataGrid> 

    </Grid> 
</Window>