2009-10-04 8 views
6

Ho seguente codice:Binding UpdateSourceTrigger = espliciti, aggiornamenti fonte all'avvio del programma

<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(); 
    } 
} 

voglio aggiornare fonte solo quando "Enter" si preme il tasto in casella di testo. Funziona bene Tuttavia, l'origine degli aggiornamenti vincolanti all'avvio del programma. Come posso evitare questo? Mi sto perdendo qualcosa?

risposta

-2

Cambia la tua Binding modalità a predefinito

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

come è che dovrebbe aiuto? –

0

Il problema è, che DataBinding è stato risolto sulla chiamata di Show (e InitializeComponent, ma che non è importante per voi, perché a quel indica che DataContext non è stato ancora impostato). Non penso che tu possa impedirlo, ma ho un'idea per una soluzione alternativa:

Non impostare DataContext prima di chiamare Show(). È possibile raggiungere questo obiettivo (per esempio) in questo modo:

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

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

e:

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

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