0

Silverlight5プロジェクトでMVVM/Caliburn.Microを使用していますが、ユーザーがSilverlightテキストボックスに入力するテキストを大文字に自動的に変更する必要があります。

まず、ViewModelのバッキング変数を大文字に設定するだけで、双方向のバインドでテキストが変更されると思いました。それは機能しませんでした(フォーカスが失われたイベントを使用すると機能すると思いますが、KeyUpに対しても他にやらなければならないことがあるため、それを行うことはできません。2つのイベントをアタッチするとxamlエラーが発生します)

それがうまくいかなかったので、KeyUpイベントでメソッドを呼び出してみました。これは技術的には機能しますが、テキストを置き換えるため、カーソルが最初に戻るため、ユーザーは逆方向に入力することになります。

これはかなり単純な機能のようです-ユーザーが入力したテキストを大文字に変換するにはどうすればよいですか?簡単なものが足りませんか?

これが私の既存のコードです。Xaml:

<TextBox x:Name="SomeName" cal:Message.Attach="[Event KeyUp] = [Action ConvertToUppercase($eventArgs)]" />

モデルの表示:

public void ConvertToUppercase(System.Windows.Input.KeyEventArgs e)
{
     SomeName = _someName.ToUpper();
     //Other code that doesn't concern uppercase
}



代替ソリューションの編集: McAdenは優れた一般的なソリューションを発表しました。また、ほぼ同時に、別の解決策があることに気付きました(テキストボックスをパラメーターとして大文字のメソッドに渡し、カーソルを移動するだけです)。そのためのコードも次のとおりです。

xaml:

<TextBox x:Name="SomeName" cal:Message.Attach="[Event KeyUp] = [Action ConvertToUppercase($source, $eventArgs)]; [Event KeyDown] = [Action DoOtherStuffThatIsntQuestionSpecific($eventArgs)]" />

csメソッド:

public void ConvertToUppercase(TextBox textBox, System.Windows.Input.KeyEventArgs e)
{
    //set our public property here again so the textbox sees the Caliburn.Micro INPC notification fired in the public setter
    SomeName = _someName.ToUpper();

    //move the cursor to the last so the user can keep typing
    textBox.Select(SomeName.Length, 0);
}

そしてもちろん、cs標準のCaliburn.Microプロパティ:

private String _someName = "";
public String SomeName
{
    get
    {
        return _someName;
    }
    set
    {
        _someName = value;
        NotifyOfPropertyChange(() => SomeName);
    }
}
4

2 に答える 2

4

ここに記載されているように ToUpper EventTrigger を作成します。また、達成しようとしている他の機能のために別のものを作成します。両方を xaml に追加します。

<TextBox Text="{Binding SomeName, Mode=TwoWay}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="TextChanged">
            <myBehaviors:UpperCaseAction/>
        </i:EventTrigger>
        <i:EventTrigger EventName="TextChanged">
            <myBehaviors:MyOtherAction/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

編集:私は以下を使用してこのソリューションを完全にテストしました(コードビハインドは関係ありません)

大文字のアクション:

public class UpperCaseAction : TriggerAction<TextBox>
{
    protected override void Invoke(object parameter)
    {
        var selectionStart = AssociatedObject.SelectionStart;
        var selectionLength = AssociatedObject.SelectionLength;
        AssociatedObject.Text = AssociatedObject.Text.ToUpper();
        AssociatedObject.SelectionStart = selectionStart;
        AssociatedObject.SelectionLength = selectionLength;
    }
}

その他のアクション:

public class OtherAction : TriggerAction<TextBox>
{
    Random test = new Random();

    protected override void Invoke(object parameter)
    {
        AssociatedObject.FontSize = test.Next(9, 13);
    }
}

XAML 名前空間 (この場合、TestSL は私のテスト プロジェクトの名前空間です - 必要に応じて名前空間を使用してください):

xmlns:local="clr-namespace:TestSL"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

XAML テキスト ボックス

<Grid x:Name="LayoutRoot" Background="LightGray" Width="300" Height="200">
    <TextBox TextWrapping="Wrap" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10" Width="100">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="TextChanged">
                <local:UpperCaseAction />
            </i:EventTrigger>
            <i:EventTrigger EventName="TextChanged">
                <local:OtherAction />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBox>
</Grid>
于 2012-10-23T21:08:42.580 に答える
1

UpperCaseConverter.cs:

namespace MyProject.Converters
    {
        /// <summary>
        /// A upper case converter for string values.
        /// </summary>
        public class UpperCaseConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return ConvertToUpper(value);
            }

            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return ConvertToUpper(value);
            }

            private string ConvertToUpper(object value)
            {
                if (value != null)
                {
                    return value.ToString().ToUpper();
                }
                return null;
            }
        }
    }

AppResources.xaml:

<ResourceDictionary
    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:conv="clr-namespace:MyProject.Converters;assembly=MyProject"
    mc:Ignorable="d"
    >

    <!-- Converters -->
    <conv:UpperCaseConverter x:Key="UpperCaseConverter"/>

</ResourceDictionary>

MyFormView.xaml:

<UserControl>
    <TextBox Text="{Binding myText, Mode=TwoWay, Converter={StaticResource UpperCaseConverter}}" />
</UserControl>
于 2013-10-20T12:49:59.670 に答える