2009-10-04 9 views
6

Tôi đã mã sau:Binding UpdateSourceTrigger = Explicit, cập nhật nguồn tại chương trình khởi động

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

Tôi muốn cập nhật nguồn duy nhất khi phím "Enter" được nhấn trong textbox. Điều này hoạt động tốt. Tuy nhiên ràng buộc cập nhật nguồn lúc khởi động chương trình. Làm thế nào tôi có thể tránh điều này? Tui bỏ lỡ điều gì vậy?

Trả lời

-2

Thay đổi Ràng buộc của bạn Chế độ để Mặc định

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

thế nào là nghĩa vụ giúp đỡ? –

0

Vấn đề là, rằng DataBinding được giải quyết trên tiếng gọi của Show (và trên InitializeComponent, nhưng đó không phải là quan trọng đối với bạn, bởi vì ở đó điểm DataContext của bạn chưa được đặt). Tôi không nghĩ rằng bạn có thể ngăn chặn điều đó, nhưng tôi có ý tưởng giải quyết:

Không đặt DataContext trước khi bạn gọi Show(). Bạn có thể đạt được điều này (ví dụ) như thế này:

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

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

và:

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

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