0

http://blog.roboblob.com/2010/07/16/custom-silverlight-textbox-control-that-immediately-updates-databound-text-property-in-twoway-bindingから取得したカスタム テキスト ボックスがあります。/コメントページ-1/ :

public class ImmediateTextBox : TextBox
{
    public ImmediateTextBox()
    {
        this.Loaded += ImmediateTextBox_Loaded;
    }

    void ImmediateTextBox_Loaded(object sender, RoutedEventArgs e)
    {            
        this.GotFocus +=  ImmediateTextBox_GotFocus;
        this.TextChanged += new TextChangedEventHandler(ImmediateTextBox_TextChanged);
    }

    void ImmediateTextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox txt = sender as TextBox;

        if (txt != null)
        {
            BindingExpression bindExp = txt.GetBindingExpression(TextBox.TextProperty);
            if (bindExp != null)
            {
                bindExp.UpdateSource();
            }//if

        }//if

    }

    void ImmediateTextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        this.SelectAll();
    }
 }

私のxamlではこれを使用していますが、ネストされていて、親コンテナにImmediateTextBoxがある場合を除いて、正常に動作します:

 <ItemsControl Grid.Column="1" ItemsSource="{Binding Path=LstForecast}">
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
                    <customControls:ImmediateTextBox Padding="8" Height="36" Text="{Binding Path=DForecastQuantityShippedTotal,
                                                                                StringFormat=\{0:n0\},
                                                                                Mode=TwoWay,
                                                                                Converter={StaticResource StringToNullableDoubleConverter}}"
                                                                                 Width="70" IsEnabled="{Binding Path=IsForecastUserEditable}"/>
            <!--Weeks-->
            <ItemsControl ItemsSource="{Binding Path=LstWeeks}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                                    <customControls:ImmediateTextBox Padding="8" Width="70" Height="36"
                                                                                    Text="{Binding Path=DForecastQuantityShippedTotal, StringFormat=\{0:n0\}, Mode=TwoWay, Converter={StaticResource StringToNullableDoubleConverter}}"
                                                                                    IsEnabled="{Binding Path=IsForecastUserEditable}"/>
                            <!--days data-->
                            <ItemsControl ItemsSource="{Binding Path=LstDays}">
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Horizontal" />
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                                <customControls:ImmediateTextBox Padding="8" Width="70" Height="36"
                                                                                                             Text="{Binding Path=DForecastAutoManual,
                                                                                                                            StringFormat=\{0:n0\},
                                                                                                                            Mode=TwoWay,
                                                                                                              Converter={StaticResource StringToNullableDoubleConverter}}"
                                                                                                             IsEnabled="{Binding Path=IsForecastUserEditable}"/>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
                            <!--end days data-->
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <!--end weeks-->
        </StackPanel>
    </DataTemplate>
</ItemsControl.ItemTemplate>

最低レベルでは本当にファンキーになります。前の、場合によっては次の生成されたテキストボックスを変更します。オートコンプリートボックスを使用すると、もちろん機能します。問題は、selectedtext または selectall() メソッドがないため、オートコンプリート ボックスでは実行できないコピー/貼り付け/selectall などの動作をテキスト ボックスに追加したいことです。また、RoutedEventArgs で、originalsource が null であることにも気付きました。それを使用すると機能すると思いましたが、違います。何か助けはありますか?前もって感謝します。

4

1 に答える 1

0

さて、私はそれを理解しました。各テキスト ボックスをプロパティにバインドしています。これらのテキスト ボックスのいずれかが変更されると、ViewModel のバインドされたプロパティが相互に更新されます。それが発生すると、プロパティだけでなく、それが発生したテキストボックスを更新します。これは双方向バインディングであるためです。そのため、ユーザーの入力によって引き起こされる更新があると、更新されます。ユーザーがそのテキスト ボックスに何も入力していない場合 (テキスト ボックスがアルゴリズムから更新されている場合) はすべきではありません。

私の解決策は、ブール値のプロパティ「isUser」を ImmediateTextBox に作成することです。オーバーライドされた OnKeyDown または OnMouseLeftButtonPressed が呼び出されると、isUser を true に設定します。ユーザーが何かを入力または貼り付けてテキストが変更されたら、バインディングを更新して isUser を false に設定します。

于 2011-09-28T02:24:43.133 に答える