0

ユーザーコントロールが豊富なマスターウィンドウがあります。ナビゲーションを使用して、ユーザーコントロールにアクセスできます。しかし、問題は、ユーザー コントロールが開かれたときに最初のテキスト ボックスにフォーカスを設定する方法です。

依存関係プロパティとブール値フラグで試してみたところ、少し成功しました。UserControl を最初にレンダリングしたときはフォーカスできましたが、2 回目に開いたときは TextBox にフォーカスを設定できませんでした。

もう1つ、TextBoxesの検証があります。検証が失敗した場合、テキストボックスを空にし、それぞれのテキストボックスにフォーカスを合わせる必要があります。

WPF(CLR 3.5、VS2008)でMVVMを使用してこれを達成するにはどうすればよいですか

前もって感謝します。

4

3 に答える 3

1

UserControl がある場合は、CodeBehind もあります。

これをコードビハインド内に配置すると、問題なく実行できます。

this.Loaded += (o, e) => { Keyboard.Focus(textBox1) }

検証エラーをリッスンする場合は、これを UserControl XAML 内に配置します。

<UserControl>
 <Grid Validation.Error="OnValidationError">
  <TextBox Text{Binding ..., NotifyOnValidationError=true } />
 </Grid>
<UserControl>

UserControl の CodeBehind 内には、次のようなものがあります。

public void OnValidationError(o , args)
{
  if(o is TextBox)
  {
    (TextBox)o).Text = string.Empty;
  }
}
于 2013-10-01T13:39:37.700 に答える
0

FocusManagerを使用して試すこともできます

<UserControl>
 <Grid FocusManager.FocusedElement="{Binding Path=FocusedTextBox, ElementName=UserControlName}">
  <TextBox x:Name="FocusedTextBox" />
 </Grid>
<UserControl>
于 2013-10-01T21:54:13.360 に答える
0

AttachedProperty を使用して MVVM パターンに固執する必要があります。これにより、ビュー モデルが UI コードから独立し、完全に単体テスト可能になります。次の添付プロパティは、ブール型プロパティをバインドして TextBox をフォーカスおよび強調表示します。強調表示が必要ない場合は、強調表示コードを削除して、フォーカス コードを操作するだけです。

public class TextBoxBehaviors
    {
        #region HighlightTextOnFocus Property

        public static readonly DependencyProperty HighlightTextOnFocusProperty =
            DependencyProperty.RegisterAttached("HighlightTextOnFocus", typeof (bool), typeof (TextBoxBehaviors),
                                                new PropertyMetadata(false, HighlightTextOnFocusPropertyChanged));

        public static bool GetHighlightTextOnFocus(DependencyObject obj)
        {
            return (bool) obj.GetValue(HighlightTextOnFocusProperty);
        }

        public static void SetHighlightTextOnFocus(DependencyObject obj, bool value)
        {
            obj.SetValue(HighlightTextOnFocusProperty, value);
        }

        private static void HighlightTextOnFocusPropertyChanged(DependencyObject sender,
                                                                DependencyPropertyChangedEventArgs e)
        {
            var uie = sender as UIElement;
            if (uie == null) return;

            if ((bool) e.NewValue)
            {
                uie.GotKeyboardFocus += OnKeyboardFocusSelectText;
                uie.PreviewMouseLeftButtonDown += OnMouseLeftButtonDownSetFocus;
            }
            else
            {
                uie.GotKeyboardFocus -= OnKeyboardFocusSelectText;
                uie.PreviewMouseLeftButtonDown -= OnMouseLeftButtonDownSetFocus;
            }
        }

        private static void OnKeyboardFocusSelectText(object sender, KeyboardFocusChangedEventArgs e)
        {
            var textBox = sender as TextBox;
            if (textBox == null) return;

            textBox.SelectAll();
        }

        private static void OnMouseLeftButtonDownSetFocus(object sender, MouseButtonEventArgs e)
        {
            var textBox = sender as TextBox;
            if (textBox == null) return;

            if (!textBox.IsKeyboardFocusWithin)
            {
                textBox.Focus();
                e.Handled = true;
            }
        }

        #endregion
    }

フォーカス/強調表示する TextBox でこの添付プロパティを使用できます...

<TextBox ... local:TextBoxBehaviors.HighlightTextOnFocus="{Binding IsScrolledToEnd}" ... />
于 2013-10-01T16:19:30.367 に答える