2017-08-18 2 views
1

Ich arbeite an einem neuen WPF-Projekt und kämpfe mit der Bindung einer TextBox in DataGrid an eine Liste von Objekten in WPF. Kann mir jemand helfen, zu reparieren?Wie binden Sie eine TextBox in DataGrid an eine Liste in WPF?

Dies ist mein Code (vereinfachte Version) zum Generieren der Datagrid-Zeilen durch Bindung meiner Orders Objekt. Der Benutzer kann die Auftragspositionen ändern und in das Unterstreichungsobjekt einbinden. Sobald Benutzer klickte die Lesen Sie Bestellungen Schaltfläche Ich zeige die Änderungen im Textblock. Problem: Die Änderungen in TextBox werden nicht in das Orders-Objekt aktualisiert.

ObservableCollection<StxOrdr> Orders = new ObservableCollection<StxOrdr>(); 

private void Window_Initialized(object sender, EventArgs e) 
{ 
    Orders.Add(new StxOrdr() { ID = 1, Desc = "Order-#1", Item1 = "11", Item2 = "12", Item3 = "13" }); 
    Orders.Add(new StxOrdr() { ID = 2, Desc = "Order-#2", Item1 = "21", Item2 = "22", Item3 = "23" }); 
    Orders.Add(new StxOrdr() { ID = 3, Desc = "Order-#3", Item1 = "31", Item2 = "32", Item3 = "33" });       
    Dg2.ItemsSource = Orders; 
} 

private void ReadUpdatedOrders(object sender, RoutedEventArgs e) 
{ 
    TxtBlk.Text = ""; 
    foreach (StxOrdr odr in Orders) 
    { 
     TxtBlk.Text += string.Format("{0}: {1} - {2} - {3}\n", odr.Desc, odr.Item1, odr.Item2, odr.Item3); 
    } 
} 

Fenster Xml

<DataGrid x:Name="Dg2" HorizontalAlignment="Left" Margin="21,295,0,0" VerticalAlignment="Top" Height="230" Width="451" 
AutoGenerateColumns="false" ItemsSource="{Binding Source=Orders}" > 
<DataGrid.Columns> 
    <DataGridTextColumn Header="ID" Binding="{Binding ID}" /> 
    <DataGridTextColumn Header="Desc" Binding="{Binding Desc}" Width="80"/> 
    <DataGridTextColumn Header="Item 1" Binding="{Binding Item1}" Width="60"/> 
    <DataGridTextColumn Header="Item 2" Binding="{Binding Item2}" Width="60"/> 
    <DataGridTemplateColumn Header="Item 3" > 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding Item3, Mode=OneWayToSource}" Width="60" />        
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
</DataGrid.Columns> 
</DataGrid> 

<TextBlock x:Name="TxtBlk" HorizontalAlignment="Left" Margin="489,295,0,0" TextWrapping="Wrap" Text=" Updated order details:" 
      VerticalAlignment="Top" Height="176" Width="408" Background="#FFFFFCBC"/> 
<Button x:Name="Btn2_Copy" Content="Read Orders" HorizontalAlignment="Left" Margin="489,476,0,0" 
     VerticalAlignment="Top" Width="94" Click="ReadUpdatedOrders"/> 

Screenshot des UI-Fenster

Antwort

1

denke ich die meisten Dinge richtig aussieht. Stellen Sie sicher, dass Orders.cs implementiert INotifyPropertyChanged und dass diese Codezeile

<TextBox Text="{Binding Item3, Mode=OneWayToSource}" Width="60" /> 

wird aktualisiert, um Mode = TwoWay und Update = Property. Ich würde wechseln zu

<TextBox Text="{Binding Item3, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="60" /> 
+0

ja es funktioniert. Danke, Alter. – Chindil

Verwandte Themen