2016-07-29 14 views
-3

を「この操作はこれだけテンプレートが適用されている要素で有効です」:ユーザーコントロール内にエラー:私は、ユーザーコントロールが含まC#WPFアプリケーション持って

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

を、私はTelerik RadDataFormを持っている:

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

テンプレートは、Telerik RadGridViewButton含まれています

<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> 

コマンドを実行したい場合は、にBeginInsert()を呼び出してください。しかし、私はworkGridViewにアクセスできないようです。

私のコマンド、これまで:

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); 
} 

私の問題?私は理解していない

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

:私はeditTemplate.FindName()への呼び出しを行うと、私は例外を取得します。私はフォームからテンプレートを取得しています。どのように適用できないのですか?

+0

この質問は、Telerikライブラリに非常に特異的であるように思われます。おそらく、そのベンダーの製品に精通している人から特別な助けが必要になるでしょう。それを超えると、良い[mcve]がなければ誰でも直接問題を診断することが難しいかもしれません。エラーメッセージのデバッグと調査に関して既に試したことを説明してください(返されたアイテムの関連性を含めて[ここ](https://stackoverflow.com/search?q=%5Bc%23%5D+%22This+ + + +テンプレート+適用済み。%22))。 –

答えて

0

Peter Dunihoのコメントは私の問題を解決したthis答えに私を指摘しました。

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 

代替はCommandParameterとしてworkGridViewを渡すことです:

<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(); 
} 
関連する問題