2017-08-08 1 views
0

Ich habe ein DataGrid, mit dem ein Benutzer Eigenschaften von elektronischen Geräten bearbeiten kann, wie z. B. welche Ein- und Ausgänge die Geräte zum Zeichnen von Schaltplänen haben. Es kann Szenarien geben, in denen der Benutzer ein zuvor gespeichertes Gerät bearbeitet - in diesem Fall wird die ItemsSource an die Eigenschaften eines bereits definierten Objekts gebunden. Häufiger erstellt der Benutzer ein neues Gerät von Grund auf, so dass die ItemsSource zum Starten leer ist. Wenn dies der Fall ist, ist mein DataGrid vollständig leer, und ich möchte, dass es eine leere Zeile anzeigt. Meine Zellen bestehen aus bearbeitbaren ComboBoxen.Wie kann ich sicherstellen, dass mein WPF DataGrid mindestens eine Zeile anzeigt, wenn ItemsSource leer ist? (Editierbare ComboBox-Zellen)

Ich bin bisher nicht in der Lage, das DataGrid eine zuvor definierte ItemsSource anzuzeigen, sowie eine leere Zeile anzeigen, wenn ItemsSource leer ist.

XAML:

<DataGrid Grid.Column="0" Grid.ColumnSpan="2" 
       Grid.Row="1" Grid.RowSpan="2" 
       ScrollViewer.VerticalScrollBarVisibility="Auto" 
       ItemsSource="{Binding InputList}"> 
     <DataGrid.Columns> 

      <DataGridTemplateColumn Header="Label" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox IsEditable="True" 
            Text="{Binding NewLabel}" 
            ItemsSource="{Binding Label}" 
            SelectedValue="{Binding SelectedLabel}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Header="Signal" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox IsEditable="True" 
            Text="{Binding NewSignal}" 
            ItemsSource="{Binding Signal}" 
            SelectedValue="{Binding SelectedSignal}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Header="Terminal" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox IsEditable="True" 
            Text="{Binding NewTerminal}" 
            ItemsSource="{Binding Terminal}" 
            SelectedValue="{Binding SelectedTerminal}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

     </DataGrid.Columns> 

    </DataGrid> 

Bindungen sind wie folgt: Inputlist - eine Liste von Strukturen {label, Signal, Terminal} für eine zuvor definierte Vorrichtung. Neue Strukturen werden beim Speichern erstellt, wenn es sich um ein neues Gerät handelt. Diese Liste (IOStruct) ist eine Eigenschaft meines Geräteobjekts.

NewLabel - Benutzer können ein neues Etikett eingeben, wenn es eine ist, die bisher nicht Labels verwendet wird - Master-Liste der zuvor definierten Etiketten (für eine schnelle Zugabe mit dem automatischen Vervollständigung)

selectedLabel - das verwendet wird, um generiert die neue Struktur, wenn der Benutzer eine zuvor definierte Bezeichnung auswählt

Die nächsten zwei Spalten haben ähnliche Bindungen, aber für Signaltypen und Terminaltypen.

Das Ausführen der Anwendung ohne definierte InputList gibt mir ein leeres DataGrid, mit dem ich nichts machen kann. Ich möchte, dass es in diesem Fall eine leere Zeile gibt.

Jede Hilfe oder Tipps, um dies zu tun und meine Praxis zu verbessern, wird sehr geschätzt!

+0

Wäre es nicht Art von Niederlage der Zweck? Die Idee hinter der Bindung an eine Sammlung besteht darin, die Sammlung im DataGrid darzustellen, ohne sich um das manuelle Auffüllen von Spalten und Zeilen kümmern zu müssen. Wenn Ihre Liste also leer oder leer ist, ist natürlich auch Ihr DataGrid leer. Ich bin neugierig zu wissen, warum Sie eine leere Reihe wollen? – Sach

+0

Da dieses Fenster auch zum Erstellen eines neuen Geräts verwendet werden kann, würde die Sammlung in diesem Fall leer beginnen.Wenn ich überhaupt keine ItemsSource-Bindung definiere, bekomme ich keine leere Zeile und kann auch keine Zeilen hinzufügen (auch nicht mit CanUserAddRows = "True") – pearldrumbum

+0

Haben Sie versucht ItemsSource = "{Binding InputList, Mode = TwoWay} "? – Palamino

Antwort

0

Sie so etwas wie dieses versuchen ...

zunächst eine zusätzliche Spalte in Datagrid hinzuzufügen ..

<DataGridTemplateColumn Header="Display Order" Width="96" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding DisplayOrder}" Margin="0" VerticalAlignment="Center" TextAlignment="Right" 
           HorizontalAlignment="Stretch" x:Name="txtDisplayOrder" Tag="{Binding}" 
           Loaded="txtDisplayOrder_Loaded" MaxLength="1" Background="Transparent" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

Das Displayorder Feld sollte in Ihrem Itemssource vom Typ int vorhanden sein ..

das Loaded-Ereignis sollte

private void txtDisplayOrder_Loaded(object sender, RoutedEventArgs e) 
    { 
     TextBox txt = sender as TextBox; 
     ValidationRuleInteger objDisplayOrder = new ValidationRuleInteger("Display Order", true, false); 
     if (txt != null && objDisplayOrder != null) 
      txt.GetBindingExpression(TextBox.TextProperty).ParentBinding.ValidationRules.Add(objDisplayOrder); 

    } 

Und schließlich die Klasse gültig wie dieser sein ationRuleInteger sollte wie folgt lauten:

public class clsValidationRuleInteger :ValidationRule 
{ 
    public string strmsg; 
    public bool isRequired; 
    public bool? isRegex; 
    bool AllowNegativeValues; 

    public clsValidationRuleInteger(string strmsg, bool isRequired, bool _AllowNegativeValues) 
    { 
     this.strmsg = strmsg; 
     this.isRequired = isRequired; 
     AllowNegativeValues = _AllowNegativeValues; 
    } 

    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Dies sollte nach Ihren Anforderungen gut funktionieren ...

Verwandte Themen