2009-10-04 22 views
6

पर स्रोत मैं कोड निम्नलिखित है:बाइंडिंग UpdateSourceTrigger = स्पष्ट, अद्यतन कार्यक्रम स्टार्टअप

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

मैं स्रोत केवल जब "Enter" कुंजी पाठ बॉक्स में दबाया जाता है अद्यतन करना चाहते। यह ठीक काम करता है। हालांकि कार्यक्रम स्टार्टअप पर अपडेट बाध्यकारी स्रोत। इससे कैसे बचा जा सकता है? क्या मैं कुछ भूल रहा हूँ?

उत्तर

-2
अपने बाइंडिंग बदलें

मोडडिफ़ॉल्ट

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

कैसे है कि माना जाता है कि मदद के लिए आप इस इस तरह (उदाहरण के लिए) प्राप्त कर सकते हैं? –

0

समस्या है, कि DataBinding शो (की और InitializeComponent पर फोन पर हल हो गई है, लेकिन यह है कि क्योंकि पर, आप के लिए महत्वपूर्ण नहीं है इंगित करें कि आपका डेटा कॉन्टेक्स्ट अभी तक सेट नहीं है)। मुझे नहीं लगता कि आप इसे रोक सकते हैं, लेकिन मेरे पास वर्कअराउंड के लिए एक विचार है:

कॉल() को कॉल करने से पहले डेटा कॉन्टेक्स्ट सेट न करें।

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

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

और:

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

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