2009-10-04 11 views
6

Mam następujący kod:Oprawa UpdateSourceTrigger = źródło wyraźne, aktualizacje przy starcie programu

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Grid> 
    <TextBox Text="{Binding Path=Name, 
          Mode=OneWayToSource, 
          UpdateSourceTrigger=Explicit, 
          FallbackValue=default text}" 
      KeyUp="TextBox_KeyUp" 
      x:Name="textBox1"/> 
</Grid> 

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void TextBox_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter) 
     { 
      BindingExpression exp = this.textBox1.GetBindingExpression(TextBox.TextProperty); 
      exp.UpdateSource(); 
     } 
    } 
} 



    public class ViewModel 
{ 
    public string Name 
    { 
     set 
     { 
      Debug.WriteLine("setting name: " + value); 
     } 
    } 
} 



    public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     Window1 window = new Window1(); 
     window.DataContext = new ViewModel(); 
     window.Show(); 
    } 
} 

Chcę zaktualizować źródło tylko wtedy, gdy „Enter” jest wciśnięty w polu tekstowym. To działa dobrze. Jednak wiążące źródło aktualizacji podczas uruchamiania programu. Jak mogę tego uniknąć? Czy czegoś brakuje?

Odpowiedz

-2

zmienić Oprawa Tryb do Domyślnie

<TextBox Text="{Binding Path=Name, 
        Mode=Default, 
        UpdateSourceTrigger=Explicit, 
        FallbackValue=default text}" 
     KeyUp="TextBox_KeyUp" 
     x:Name="textBox1"/> 
+0

jak to ma pomóc? –

0

Problem polega na tym, że DataBinding został rozwiązany na wezwanie Show (i na InitializeComponent, ale nie jest to dla Ciebie ważne, ponieważ w tym wskaż, że twój DataContext nie jest jeszcze ustawiony). Nie sądzę, że można temu zapobiec, ale mam pomysł obejścia tego problemu:

Nie ustawiaj DataContext przed wywołaniem Show(). Można to osiągnąć (na przykład) tak:

public partial class Window1 : Window 
{ 
    public Window1(object dataContext) 
    { 
     InitializeComponent(); 

     this.Loaded += (sender, e) => 
     { 
      DataContext = dataContext; 
     }; 
    } 
} 

oraz:

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    Window1 window = new Window1(new ViewModel()); 
    window.Show(); 
} 
Powiązane problemy