2016-12-22 2 views
0

In meinem WPF-Projekt habe ich ein Datagrid, das von einem Dataset aufgefüllt wird und einige Spalten und viele Zeilen enthält. Ich möchte durch Spalte [1] Zeilen [i] (z. B. erhalten Sie die Werte innerhalb der Zellen der Spalte [1] für alle Zeilen im Datagrid). Meine Frage ist Wie kann ich diese Zellen Wert an eine einzelne Textbox binden? Ich weiß, mit Multibinding wäre einer der Wege, um die Lösung zu erreichen, aber ich habe keine Hilfe in Bezug auf Multibinding eine Textbox über ein Datagrid gefunden. Zum Beispiel habe ich folgende Fragen lauten:Binden Sie mehrere Zellen Wert aus DataGrid-Spalte in ein einzelnes Textfeld

How to bind multiple values to a single WPF TextBlock?

How to use a MultiBinding on DataGridTextColumn?

Auch einen einzelnen Wert verbindlich ist erreichbar, und ich habe bereits getan. Ich würde jede Hilfe zu schätzen wissen. Danke im Voraus !!

Meine XAML:

<DataGrid x:Name="datagridbatch" 
      FontSize="13.333" FontWeight="Normal" 
      IsReadOnly="True" 
      SelectionChanged="datagridbatch_SelectionChanged" 
      SelectionUnit="FullRow" SelectionMode="Single" 
      VerticalAlignment="Top" HorizontalAlignment="Right" 
      Height="615" Width="373" Margin="0,0,0,-582" 
      CanUserResizeColumns="False" CanUserResizeRows="False" 
      CanUserDeleteRows="False" CanUserAddRows="False" 
      RowHeight="30" 
      Grid.Row="5" Grid.Column="1" 
      CanUserReorderColumns="False" CanUserSortColumns="False" 
      ColumnHeaderHeight="25" ColumnWidth="*" 
      ScrollViewer.CanContentScroll="True" 
      ScrollViewer.VerticalScrollBarVisibility="Auto" /> 
<TextBox x:Name="input2" 
     Margin="0,0,0,0" Width="490" Height="30" 
     Grid.Row="0" Grid.Column="1" 
     HorizontalAlignment="Left" 
     Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}" 
     FontSize="13.333" FontWeight="Normal" 
     Text="{Binding SelectedItem.UNIQUEPART_ID, ElementName=datagridbatch}" 
     BorderBrush="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}" 
     FontFamily="Tahoma" 
     IsReadOnlyCaretVisible="True" 
     HorizontalScrollBarVisibility="Auto" 
     ScrollViewer.CanContentScroll="True"/> 
+0

Sie können den Konverter beim Zuweisen des Textes zu TextBox verwenden, im Konverter können Sie den Wert basierend auf dem ausgewählten Element des Rasters zurückgeben. Kannst du es versuchen? Bitte ignorieren, wenn es bereits versucht wurde. –

+0

Bitte geben Sie "multiple cell values" an. Möchten Sie einen Text aus __all rows__, aus __selected rows__ oder aus einer anderen Teilmenge möglicher Werte erstellen? – grek40

+0

@ grek40 Sorry, ich habe die Frage bearbeitet.Ich benötige tatsächlich die Werte von den Zellen der vorgewählten Reihen und der spezifizierten Spalte (konnte von 1 bis 10000 sein) aber ich benötige alle von ihnen. I, dann verwende sie als Eingabeparameter für eine Abfrage. – Zak29

Antwort

0

Die Idee, einen normalen Binding mit einem Konverter verwendet, die eine Auflistung von Elementen verarbeitet. Die Verwendung einer MultiBinding funktioniert nicht wirklich für eine dynamische Sammlung von Bindungsquellelementen. Also was ist erforderlich:

  • A DataGrid mit Elementen, wobei jedes Element eine bestimmte Eigenschaft enthält
  • A TextBox
  • A Binding auf der TextBox.Text Eigenschaft, wo die SelectedItems von DataGrid sind mit einem Konverter verpflichtet, ein zu schaffen einzelner Text
  • Ein Converter, der eine Elementauflistung übernimmt und eine Zeichenfolge aus den Elementeigenschaften erstellt
  • Einige Update-Logik t o aktualisiertem Text zu gewährleisten, wenn die ausgewählten Elemente aktualisieren

Fangen wir mit dem XAML zu starten, kann es ziemlich einfach sein:

<Window.Resources> 
    <local:ItemsToTextConverter x:Key="cItemsToTextConverter"/> 
</Window.Resources> 

<!-- your surrounding controls --> 

<DataGrid x:Name="datagridbatch" SelectionChanged="datagridbatch_SelectionChanged"/> 
<TextBox x:Name="input2" Text="{Binding ElementName=datagridbatch,Path=SelectedItems,Converter={StaticResource cItemsToTextConverter},Mode=OneWay}"/> 

Beachten Sie, dass die Bindearbeiten nur einen Weg - es ist nicht so leicht zu verteilen Der String-Wert wird in mehrere Elemente zurückversetzt, um die Elemente in einer einzigen Zeichenfolge zu komprimieren.

Der Konverter benötigt einen Artikel Sammlung zu nehmen und eine Zeichenfolge aus der Eigenschaft extrahieren:

public class ItemsToTextConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var items = value as IEnumerable; 
     if (items != null) 
     { 
      // note: items may contain the InsertRow item, which is of different type than the existing items. 
      // so the items collection needs to be filtered for existing items before casting and reading the property 
      var items2 = items.Cast<object>(); 
      var items3 = items2.Where(x => x is MyItemType).Cast<MyItemType>(); 
      return string.Join(Environment.NewLine, items3.Select(x => x.UNIQUEPART_ID)); 
     } 
     return string.Empty; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new InvalidOperationException(); 
    } 
} 

Auch DataGrid.SelectedItems wird nicht automatisch ein verbindliches Update ausgelöst, wenn die Auswahl ändert, so dass Sie eine manuelle auslösen müssen Update in der Auswahl ändern Event-Handler:

void datagridbatch_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var binding = BindingOperations.GetBindingExpression(input2, TextBox.TextProperty); 
    if (binding != null) 
    { 
     binding.UpdateTarget(); 
    } 
} 
+0

Ich habe ein paar Fragen zu diesen Codezeilen: var items2 = items.Cast (); var items3 = items2.Where (x => x ist MyItemType) .Cast (); Rückgabe string.Join (Environment.NewLine, items3.Select (x => x.UNIQUEPART_ID)); 1sr Frage: was meinst du mit Artikeln kann InsertRow Artikel enthalten, die von einem anderen Typ als die vorhandenen Elemente ist. 2. Filtern Sie die Artikelsammlung in den oben genannten Zeilen? Wenn ja, können Sie das bitte ausführen? 3.: Was macht ** MyItemType ** in der Codezeile: MyItemType) .Cast (); – Zak29

+0

(1) 'DataGrid.SelectedItems' kann ein spezielles Element enthalten, das die Erstellung einer neuen Datenzeile ermöglicht und einen speziellen Typ hat. Selbst wenn alle Eingabefelder den Typ 'MyItemType' haben (dies wurde gemacht, weil Sie uns nie den Typnamen für die Daten in Ihrem 'DataGrid' genannt haben), können Sie nicht davon ausgehen, dass alle Elemente in' SelectedItems' diesen Typ haben . Aus diesem Grund filtere ich die Objekte vor dem Casting nach Typ. Die 'Where' Methode ist verfügbar auf' IEnumerable ', aber nicht auf' IEnumerable', also werfe ich zuerst alle Elemente auf 'object'. Kann mehr Erklärung schreiben, wenn Weihnachten vorbei ist;) – grek40

Verwandte Themen