2011-09-27 52 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。

相關問題