2017-03-17 7 views
0

ビュー内に2つのビュー(ContainerControl内に含まれています)を含むビューがあります。 ビューの反対側には、Telerik GridViewがあり、ユーザーは行を選択できます。行が選択されると、ビューの反対側が別のビュー(およびViewModel)に動的に変更されます。動的なビューは、テキストボックスがたくさんある単純なグリッドなので、何も特別なものはありません。クリックするとコンテンツコントロール内のテキストボックスにフォーカスを設定するにはどうすればよいですか?

ユーザーは、動的に読み込まれたビューに値を入力したい場合は、最初にContentControlをクリックしてから再度フォーカスを移動するTextBoxをクリックする必要があります。これは、GridViewの行がの編集モードにある場合にのみ発生します。

私はContentControlのFocusManager.IsFocusScope="False"を設定しようとしました。

他のすべてのコントロールをIsFocusable=Falseで設定しようとしました。

私はWPFイベントでこれを行う方法が必要であることは知っていますが、私はこの分野の専門家ではありません。

私は(それが関連性のそれを知らない)、このようCatelのコンバータを使用して、ダイナミックビューの設定です:

XAML:

<ContentControl Content="{Binding SelectedItemViewModel, Mode=TwoWay, Converter={catel:ViewModelToViewConverter}}" /> 

のViewModel:

public MyDataModel SelectedItem 
{ 
    get { return GetValue<MyDataModel>(SelectedItemProperty); } 
    set 
    { 
     SetValue(SelectedItemProperty, value); 
     RaisePropertyChanged(() => SelectedItemViewModel); 
    } 
} 
public static readonly PropertyData SelectedItemProperty = RegisterProperty("SelectedItem", typeof(MyDataModel)); 

    public ViewModelBase SelectedItemViewModel 
    { 
     get 
     { 
      if (SelectedItem != null) 
      { 
       switch (SelectedItem.Type) 
       { 
        case 1: 
         return new OneViewModel(SelectedItem); 
        case 2: 
         return new TwoViewModel(SelectedItem); 
       } 
      } 

      return null; 
     } 
    } 
+1

ビューを動的にロードするために使用した戦略が不明なため、十分なデータなしでは答えられません。可能であれば、より理解しやすいように簡単なサンプルアプリケーションを作成できますか? – Gopichandar

+0

'TextManager'に' FocusManager.FocusedElement = "{Binding RelativeSource = {RelativeSource Self}}" 'を試しましたか? – Gopichandar

+0

GopichandarのFocusManagerを使用すると、現在選択されているテキストボックスが常に選択され、ユーザーがクリックしたテキストボックスにはなりません。 –

答えて

0

回避される基準1つの大きなxamlにビューをマージします。何らかの理由で、Telerikのグリッドビューは、参照されたビューからカーソルを「盗んだ」が、すべてのコントロールが同じxamlファイルにあると、すべてが期待通りに機能する。

0

これは、少し奇妙な行動。フォーカスは、コンテンツコントロールではなく、マウスクリックのコントロールに設定する必要があります。あなたが何をやっているのか分かりません。私はサンプルアプリケーションで試して、期待どおりに動作します。

This threadには良い解決策はないと言われています。唯一のオプションは、コントロールのテンプレート内でコンテンツコントロールのIsTabStopプロパティをFalseに設定し、子パーツがバインドされる新しいプロパティIsChildTabStopを追加することです。それがあなたを助けるかどうかは分かりません。

参考:MSDN Forum

0

オールライト、ここでは簡単な解決策である - ない美しい1:

これが唯一の正しい答えです - あなただけTextBoxが表示後Focusを持っているしたい場合が読み込まれます。

XAML

<UserControl x:Class="WpfApplication4.MyUserControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfApplication4" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <TextBox Loaded="TextBox_Loaded"/> 
    </Grid> 
</UserControl> 

分離コード

private void TextBox_Loaded(object sender, RoutedEventArgs e) 
    { 
     TextBox self = sender as TextBox; 

     if (self != null) 
      self.Focus(); 
    } 

私が言ったように - これは私が外観(異なるXAMLファイル)を除去することによって、これを解決

関連する問題