2008-10-31 4 views
5

У меня есть приложение Silverlight 2, которое проверяет данные OnTabSelectionChanged. Сразу же я начал желать, чтобы UpdateSourceTrigger разрешал больше, чем просто LostFocus, потому что если вы нажмете на вкладку без табуляции с элемента управления, объект LINQ не будет обновлен до проверки.Временное решение для UpdateSourceTrigger LostFocus на Silverlight Datagrid?

Я работал вокруг вопроса для TextBoxes, установив фокус на другой элемент управления, а затем обратно OnTextChanged:

Private Sub OnTextChanged(ByVal sender As Object, ByVal e As TextChangedEventArgs) 
    txtSetFocus.Focus() 
    sender.Focus() 
End Sub 

Сейчас я пытаюсь добиться того же рода хак в DataGrid. Мой DataGrid использует DataTemplates, сгенерированные во время выполнения для CellTemplate и CellEditingTemplate. Я попытался записать TextChanged = "OnTextChanged" в TextBox в DataTemplate, но он не запускается.

У кого-нибудь есть идеи?

+0

кто-нибудь есть идеи на этот? – 2008-11-07 13:49:54

ответ

6

You can do it with a behavior applied to the textbox too

// xmlns:int is System.Windows.Interactivity from System.Windows.Interactivity.DLL) 
// xmlns:behavior is your namespace for the class below 
<TextBox Text="{Binding Description,Mode=TwoWay,UpdateSourceTrigger=Explicit}"> 
    <int:Interaction.Behaviors> 
     <behavior:TextBoxUpdatesTextBindingOnPropertyChanged /> 
    </int:Interaction.Behaviors> 
</TextBox> 


public class TextBoxUpdatesTextBindingOnPropertyChanged : Behavior<TextBox> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     AssociatedObject.TextChanged += new TextChangedEventHandler(TextBox_TextChanged); 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 

     AssociatedObject.TextChanged -= TextBox_TextChanged; 
    } 

    void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     var bindingExpression = AssociatedObject.GetBindingExpression(TextBox.TextProperty); 
     bindingExpression.UpdateSource(); 
    } 
} 
-2

Я знаю, что это не новость ... но я получил вокруг этого, делая это:

Text = "{Binding Path = newQuantity, UpdateSourceTrigger = PropertyChanged}"

+2

Чу, из всего, что я прочитал, нет выбора PropertyChanged для UpdateSourceTrigger в SL2 или SL3.? – 2010-01-27 14:45:08

+2

Свойство PropertyChanged является значением для UpdateSourceTrigger в WPF. – sparks 2010-02-03 19:42:25

0

Этот блог показывает, как обновить источник текстового поля в явном виде, используя вложенное свойство: http://www.thomasclaudiushuber.com/blog/2009/07/17/here-it-is-the-updatesourcetrigger-for-propertychanged-in-silverlight/

Вы можете легко изменить его для работы с другими органами управления, а также ...

0

Я столкнулся с этой же проблемой, используя MVVM и S ilverlight 4. Проблема в том, что привязка не обновляет источник до тех пор, пока текстовое поле не потеряет фокус, но установка фокуса на другой элемент управления не делает этого трюка.

Я нашел решение, используя комбинацию двух разных сообщений в блоге. Я использовал код из концепции DefaultButtonHub Патрик Cauldwell, в одной "SmallWorkaround" от SmallWorkarounds.net

http://www.cauldwell.net/patrick/blog/DefaultButtonSemanticsInSilverlightRevisited.aspx

www.smallworkarounds.net/2010/02/elementbindingbinding-modes.html

Мои изменения привели в следующем коде для класса DefaultButtonHub:

public class DefaultButtonHub 
{ 
    ButtonAutomationPeer peer = null; 

    private void Attach(DependencyObject source) 
    { 
     if (source is Button) 
     { 
      peer = new ButtonAutomationPeer(source as Button); 
     } 
     else if (source is TextBox) 
     { 
      TextBox tb = source as TextBox; 
      tb.KeyUp += OnKeyUp; 
     } 
     else if (source is PasswordBox) 
     { 
      PasswordBox pb = source as PasswordBox; 
      pb.KeyUp += OnKeyUp; 
     } 
    } 

    private void OnKeyUp(object sender, KeyEventArgs arg) 
    { 
     if (arg.Key == Key.Enter) 
      if (peer != null) 
      { 
       if (sender is TextBox) 
       { 
        TextBox t = (TextBox)sender; 
        BindingExpression expression = t.GetBindingExpression(TextBox.TextProperty); 
        expression.UpdateSource(); 
       } 
       ((IInvokeProvider)peer).Invoke(); 
      } 
    } 

    public static DefaultButtonHub GetDefaultHub(DependencyObject obj) 
    { 
     return (DefaultButtonHub)obj.GetValue(DefaultHubProperty); 
    } 

    public static void SetDefaultHub(DependencyObject obj, DefaultButtonHub value) 
    { 
     obj.SetValue(DefaultHubProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for DefaultHub. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DefaultHubProperty = 
     DependencyProperty.RegisterAttached("DefaultHub", typeof(DefaultButtonHub), typeof(DefaultButtonHub), new PropertyMetadata(OnHubAttach)); 

    private static void OnHubAttach(DependencyObject source, DependencyPropertyChangedEventArgs prop) 
    { 
     DefaultButtonHub hub = prop.NewValue as DefaultButtonHub; 
     hub.Attach(source); 
    } 

} 

Это должно быть включено в какой-то документации для Silverlight :)