C#, WPF, binden List<string> an die DataGrid -
Ich Probleme habe, Sie zu binden eine Liste an ein DataGrid. Es sollte so einfach wie möglich. Ich bin neu in WPF und das ist für meine persönliche Bildung.
Ich habe eine Ansicht(Editor),ViewModel(VMText) und Daten(JustText) Klasse.
Meine Quelle so weit:
JustText.cs
namespace Model
{
public class Text
{
private string _code;
public string Code
{
get { return _code; }
set { _code = value; }
}
public Text()
{
_code = "Hello World!\nHow you doin'?";
}
}
}
VMText.cs
namespace ViewModel
{
public class VMText
{
private Model.Text _code;
public List<string> Code
{
get { return new List<string>(_code.Code.Split('\n')); }
set { _code.Code = System.String.Join("\n", value.ToArray()); }
}
private View.Editor editor;
public VMText(View.Editor editor)
{
_code = new Model.Text();
this.editor = editor;
}
}
}
- Editor.xaml
<Window x:Class="View.Editor"
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:View"
mc:Ignorable="d"
Title="Editor" Height="240.024" Width="269.895">
<Grid Background="#FF292929" Margin="0,0,-6.8,0.4">
<DataGrid x:Name="dataGrid"
HorizontalAlignment="Left"
Margin="0,0,0,0"
VerticalAlignment="Top"
Width="200pt"
Height="100pt"
DataContext="{Binding vmText}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Code, UpdateSourceTrigger=PropertyChanged}" Foreground="Black" Width="60" Header="Test" IsReadOnly="false" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
- Editor.xaml.cs
namespace View
{
public partial class Editor : Window
{
private ViewModel.VMText vmText;
#region Constructor
public Editor()
{
InitializeComponent();
vmText = new ViewModel.VMText(this);
DataContext = vmText;
}
#endregion
}
}
Ich will einfach nur, um zu zeigen, Liste die erstellt wird, in VMText in einer Spalte im DataGrid
- Sieht aus wie Sie benötigen, um die ItemsSource-Eigenschaft auf dem DataGrid.
public List<string> Code {...}
ist Sie die Sammlung von Daten für die DataGrid -, so Binden Sie es in<DataGrid x:Name="dataGrid" ... ItemsSource="{Binding Code}">
- 1)
ItemsSource="{Binding Code}"
. NichtDataContext
auf das Gitter überhaupt; es erbt, das aus der Sicht. 2), DassItemsSource
Bindung nicht ersetzenCode
; es werde Bearbeiten Sie die Elemente inCode
,, die passiert werden unmöglich, die Art und Weise, die Sie geschrieben haben es. Mit dem viewmodel, dass Sie haben, alles, was Sie tun können, ist, die Elemente anzuzeigen, die inCode
. SoCode
ändern muss: Es muss eineObservableCollection
von einer Klasse, die eine Eigenschaft der raster Bearbeiten können.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie wollen einfach nur, um Zeichenfolgen anzuzeigen, die in der Code-Sammlung-Eigenschaft des view-Modell im DataGrid.
Sollten Sie dann binden die ItemsSource - Eigenschaft des DataGrid auf der Code-Eigenschaft des view-Modell, und binden die DataGridTextColumn, um die Zeichenfolgen in der Code-Liste selbst. Sie nur ändern müssen, um die XAML-markup Ihrer Sicht ein bisschen zu sehen, die Saiten. Versuchen Sie dies:
Wenn Sie wirklich wollen, um das raster zu verwenden, um Bearbeiten Sie die Elemente in
Code
Sie müssen schreiben Sie Ihre viewmodel, das möglich zu machen. Sie können nicht geben, das Netz eine Auflistung von Zeichenfolgen. Sie haben, um ihm eine Sammlung von einigen der Klasse, die einen string - Eigenschaft. Das ist so, wie WPF arbeitet.Wenn Sie nicht wollen, um Sie zu Bearbeiten, setzen Sie einfach
IsReadOnly="True"
auf die Spalte, und Sie werden nur gelesen werden.Auch, alle Ihre Bindungen so Aussehen, wie Sie erraten, willkürlich auf, was alles bedeutet.
So, hier ist ein Beispiel, wie das zu tun, was ich denke Sie zu tun versuchen. Ich beseitigt Ihre
Model.Text
- Klasse, um die Dinge zu vereinfachen. Sie sind tief genug, ohne es.ViewModels.cs
MainWindow.xaml.cs
MainWindow.xaml
Sollten Sie implementieren INotifyPropertyChanged zu Benachrichtigen Bindung, die Eigenschaft verändert. Auch für die Sammlungen betrachten
ObservableCollection
stattList
.Binden VMText.Code, um die DataGrid-ItemSource. Sie brauchen nicht zu Inicialize DataGrid DataContract in den Blick, wenn Sie es im code hinter.
ViewModel
Ansicht