当我以编程方式更改用户控件时,如何使数据绑定双向工作?

How do I get data binding to work both ways, when I'm programmatically changing the user control?

我有一个 WPF 应用程序,它使用用户设置,并将其绑定到 <TextBox>,如下所示:

<Window x:Class="SampleApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    <Grid>
        <TextBox x:Name="textbox" Text="{Binding Source={StaticResource Settings}, Path=Default.Folder}"/>
    </Grid>
</Window>

App.xaml 看起来像这样:

<Application x:Class="SampleApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:properties="clr-namespace:SampleApp.Properties"
             ShutdownMode="OnExplicitShutdown"
             Startup="Application_Startup">
    <Application.Resources>
        <properties:Settings x:Key="Settings"/>
    </Application.Resources>
</Application>

这里是 App.xaml.cs:

public partial class App : Application
{
    public App()
    {
    }

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        new MainWindow().ShowDialog();
    }
}

这在一个方面非常有效:当显示 window 时,我的文本框总是显示 MySetting 的内容。

另一种方法并不像我预期的那样有效。 的作用是当用户手动写入 TextBox 时。

不起作用的是当我以编程方式对文本框进行更改时,如下所示:

textbox.Text = folderBrowserDialog.SelectedPath;

在这种情况下,MySetting 直到用户在文本框中键入内容才会更新。

我目前的解决方案是:

Properties.Settings.Default.MySetting = textbox.Text;

但它破坏了双向数据绑定的意义。

我应该怎么做才能使数据绑定双向工作,即使我正在以编程方式更改用户控件时也是如此?

But it defeats the point of having a two-way data binding.

不,不是真的。

双向绑定的是这样当代码修改源属性时UI的目标属性被更新,并且当用户修改目标 属性 时,源 属性 被更新。

绝对不存在双向绑定,因此您可以通过编程方式为目标 属性 分配一个值,并将其反映在源 属性 中,您本可以并且应该设置它.

编写 WPF 代码的人很少需要命名 UI 元素或与 XAML 中定义的元素交互。当发生这种情况时,应该 实施 用户界面 功能,例如拖放 select、拖放、密钥处理等

换句话说:在 MVVM 范例中,视图模型数据结构是 唯一 非 UI 代码应该处理的事情。绑定机制提供了由视图模型(以及可选的,背后的模型)表示的业务逻辑和由 XAML.

表示的用户界面之间的中介。

实际上,如果您要显式设置目标 属性,它通常会丢弃绑定,导致它根本无法工作。

因此,执行此操作的正确方法是,在代码隐藏中,MySetting 属性 交互。如果要更新显示给用户的值,则需要更改绑定到该值的代码隐藏 属性。