2009-10-04 6 views
6

je code suivant:Reliure UpdateSourceTrigger = explicite, source de mises à jour au démarrage du programme

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

Je veux mettre à jour la source que lorsque la touche "Enter" dans zone de texte. Cela fonctionne bien. Toutefois, la mise à jour des liens est source au démarrage du programme. Comment puis-je éviter ça? Est-ce que je manque quelque chose?

Répondre

-2

Changer votre liaison mode à Par défaut

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

comment est-ce supposé aide? –

0

Le problème est que DataBinding est résolu sur l'appel du Show (et InitializeComponent, mais ce n'est pas important pour vous, parce que point votre DataContext n'est pas encore défini). Je ne pense pas que vous pouvez empêcher cela, mais j'ai une idée pour une solution de contournement:

Ne pas définir le DataContext avant d'appeler Show(). Vous pouvez y parvenir (par exemple) comme ceci:

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

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

et:

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

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