Binding UpdateSourceTrigger = Явный, источник обновлений при запуске программы - PullRequest
6 голосов
/ 04 октября 2009

У меня есть следующий код:

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

Я хочу обновить источник только при нажатии клавиши «Ввод» в текстовом поле. Это отлично работает. Однако привязка источника обновлений при запуске программы. Как я могу избежать этого? Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 22 октября 2015

Проблема в том, что DataBinding разрешается при вызове Show (и в InitializeComponent, но это не важно для вас, поскольку в этот момент ваш DataContext еще не установлен). Я не думаю, что вы можете предотвратить это, но у меня есть идея для обхода проблемы:

Не устанавливайте DataContext перед вызовом Show (). Вы можете достичь этого (например) следующим образом:

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();
}
0 голосов
/ 24 июня 2010

Изменение привязки Режим на По умолчанию

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