0

我有一个从http://blog.roboblob.com/2010/07/16/custom-silverlight-textbox-control-that-immediately-updates-databound-text-property-in-twoway-binding获得的自定义文本框/comment-page-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() 方法。我还注意到在 RoutedEventArgs 中,originalsource 为空。我认为使用它会导致它工作,但没有。有什么帮助吗?提前致谢。

4

1 回答 1

0

好的,所以我想通了。我将每个文本框都绑定到属性。当这些文本框中的任何一个被修改时,ViewModel 的绑定属性就会相互更新。当这种情况发生时,它们会更新它出现的文本框,而不仅仅是属性,因为它是一种双向绑定。因此,当有由用户输入引起的更新时,它会更新。当用户没有在该文本框中键入任何内容时(当文本框正在从算法更新时),它不应该。

我的解决方案是在 ImmediateTextBox 中创建一个布尔属性“isUser”。当我的重写 OnKeyDown 或 OnMouseLeftButtonPressed 被调用时,我将 isUser 设置为 true。当文本从用户输入或粘贴内容发生变化时,我会更新绑定并将 isUser 设置为 false。

于 2011-09-28T02:24:43.133 回答