2011-09-27 57 views
0

我有我从http://blog.roboblob.com/2010/07/16/custom-silverlight-textbox-control-that-immediately-updates-databound-text-property-in-twoway-binding/comment-page-1/有一个自定义文本触发:Silverlight 4中重载文本框的TextChanged事件是由父文本框

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是空的。我想到使用它会导致它工作,但没有。任何帮助?提前致谢。

+0

“修改以前生成的文本框” ?这是什么意思?请问什么是实际出错的更多细节? – AnthonyWJones

+0

我其实已经想通了。所以我不会让我发布答案,直到6荷鲁斯已经过去,所以我会发布我的最终解决方案与解释时让我。 – pqsk

回答

0

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

我的解决方案是在ImmediateTextBox中创建一个布尔属性“isUser”当我覆盖OnKeyDown or OnMouseLeftButtonPressed is called I set isUser to true。当用户输入或粘贴某些内容时,文本发生更改,然后我更新绑定并将isUser设置为false。

相关问题