2016-07-29 5 views
-3

Ich habe eine C# WPF-Anwendung, die ein Benutzersteuerelement enthält:Fehler: „Dieser Vorgang ist nur gültig, auf Elemente, die diese Vorlage angewendet haben“

<UserControl 
     x:Name="payrollEntryControl" 
     x:Class="MyNamespace.PayrollEntryControl" 
     [...] 
     > 
    [...] 
</UserControl> 

Innerhalb der Benutzerkontrolle habe ich eine Telerik RadDataForm:

<telerik:RadDataForm 
     x:Name="payrollAddForm" 
     CurrentItem="[...]" 
     EditTemplate="{StaticResource myEditTemplate}" 
     /> 

Die Vorlage enthält eine Telerik RadGridView und ein Button:

<telerik:RadGridView Grid.Row="0" Grid.Column="0" 
     x:Name="workGridView" 
     [...] 
     ItemsSource="{Binding [...]}" 
     > 
    <telerik:RadGridView.Columns> 
     [...] 
    </telerik:RadGridView.Columns> 
</telerik:RadGridView> 
<Button Grid.Row="1" Grid.Column="0" 
     Command="{Binding addWorkCommand, ElementName=payrollEntryControl}" 
     > 
    Add 
</Button> 

Ich möchte, dass der Befehl BeginInsert() auf workGridView aufrufen. Aber ich kann anscheinend nicht auf workGridView zugreifen.

Mein Befehl, so weit:

private DelegateCommand addWorkCommand_ = null; 
public DelegateCommand addWorkCommand 
{ 
    get 
    { 
     if (this.addWorkCommand_ == null) 
     { 
      this.addWorkCommand_ = new DelegateCommand(
       o => addWork(o) 
      ); 
     } 

     return this.addWorkCommand_; 
    } 
} 

private void addWork(object o) 
{ 
    var addForm = this.payrollAddForm; 
    var editTemplate = addForm.EditTemplate; 
    var workGrid = editTemplate.FindName("workGridView", addForm); 
} 

Mein Problem? Als ich den Anruf zu editTemplate.FindName() machen, erhalte ich eine Ausnahme:

This operation is valid only on elements that have this template applied.

Ich verstehe nicht. Ich bekomme die Vorlage aus dem Formular. Wie kann es nicht angewendet werden?

+0

Diese Frage scheint zu den Telerik Bibliotheken sehr spezifisch. Sie werden wahrscheinlich Hilfe von jemandem benötigen, der mit den Produkten dieses Anbieters vertraut ist. Abgesehen davon, ohne eine gute [Mcve] kann es schwierig für jeden sein, das Problem direkt zu diagnostizieren. Bitte erläutern Sie, was Sie bereits im Hinblick auf das Debuggen und Recherchieren der Fehlermeldung versucht haben (einschließlich der Relevanz der zurückgegebenen Artikel [hier] (https://stackoverflow.com/search?q=%5Bc%23%5D5%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% operation + ist + valide + only + on + elements + that + hat + this + template + applied.% 22)). –

Antwort

0

Peter Duniho Kommentar wies mich auf this Antwort, die mein Problem ansprach.

This method will help you:

public T FindElementByName<T>(FrameworkElement element, string sChildName) where T : FrameworkElement 
{ 
    T childElement = null; 
    var nChildCount = VisualTreeHelper.GetChildrenCount(element); 
    for (int i = 0; i < nChildCount; i++) 
    { 
     FrameworkElement child = VisualTreeHelper.GetChild(element, i) as FrameworkElement; 

     if (child == null) 
      continue; 

     if (child is T && child.Name.Equals(sChildName)) 
     { 
      childElement = (T)child; 
      break; 
     } 

     childElement = FindElementByName<T>(child, sChildName); 

     if (childElement != null) 
      break; 
    } 

    return childElement; 
} 

And, how I use it, just add button, and on button Click:

private void Button_OnClick(object sender, RoutedEventArgs e) 
{ 
    var element = FindElementByName<ComboBox>(ccBloodGroup, "cbBloodGroup"); 
} 
[1]: https://stackoverflow.com/a/19907800/243563 

Eine Alternative ist die workGridView als Commandweitergeben müssen:

<Button Grid.Row="1" Grid.Column="0" 
    CommandParameter="{Binding ElementName=workGridView}" 
    Command="{Binding addWorkCommand}" > 
.... 

private void addWork(object o) 
{ 
    RadGridView grid = o as RadGridView; 
    grid.BeginInsert(); 
} 
Verwandte Themen