当我以编程方式更改用户控件时,如何使数据绑定双向工作?
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
属性 交互。如果要更新显示给用户的值,则需要更改绑定到该值的代码隐藏 属性。
我有一个 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
属性 交互。如果要更新显示给用户的值,则需要更改绑定到该值的代码隐藏 属性。