c# - WPF如何使用MVVM模式将值绑定(bind)到TextBox correclty

标签 c# wpf mvvm windows-template-studio

我目前正在尝试使用 WPF。我使用 Windows Template Studio for Visual Studio 创建了一个演示项目。
现在我想添加一个应该由 MVVM 模式自动保存的文本框。我将以下 XAML 添加到我的设置页面。

<TextBlock
   Style="{StaticResource BodyTextStyle}"
   Text="Default Page" />
<TextBox Text="{Binding DefaultPage}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="TextChanged">
            <i:InvokeCommandAction Command="{Binding SetDefaultPageCommand}" CommandParameter="{Binding DefaultPage}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>
SettingsViewModel我添加了以下几行:
private readonly IDefaultPageService _defaultPageService;
private string _defaultPage;
public ICommand SetDefaultPageCommand => _setDefaultPageCommand ?? (_setDefaultPageCommand = new RelayCommand<string>(OnSetDefaultPage));

public string DefaultPage
{
    get { return _defaultPage; }
    set { Set(ref _defaultPage , value); }
}

private void OnSetDefaultPage(string defaultPage)
{
    _defaultPageService.SetDefaultPage(defaultPage);
}
要保存的服务实现为:
public class DefaultPageService : IDefaultPageService
{
    public DefaultPageService()
    {
    }

    public void InitializeDefaultPage()
    {
        var theme = GetDefaultPage();
        SetDefaultPage(theme);
    }

    public void SetDefaultPage(string defaultPage)
    {
        App.Current.Properties["DefaultPage"] = defaultPage.ToString();
    }

    public string GetDefaultPage()
    {
        if (App.Current.Properties.Contains("DefaultPage"))
        {
            var defaultPage = App.Current.Properties["DefaultPage"].ToString();
            return defaultPage;
        }

        return "https://google.com";
    }

}
保存我的新字符串有效,但不幸的是,在实际绑定(bind)属性更改其值之前调用了我的命令。我已经尝试了一堆不同的 TextBox 事件,例如 KeyUpKeyDown .我发现作品的唯一事件是 LayoutUpdated但是 GUI 一次又一次地触发了这个,所以我很确定有更好的方法。
有人知道我该如何解决这个问题吗?

最佳答案

添加绑定(bind)选项UpdateSourceTrigger=PropertyChanged

<TextBox Text="{Binding DefaultPage, UpdateSourceTrigger=PropertyChanged}"/>
和二传手
您可以在 textBox 值更改时获取值。
class ViewModel
{
    private string _defaultPage;
    public string DefaultPage
    {
        get { return _DefaultPage; }
        set { _DefaultPage = value; OpPropertyChanged(); DefaultPageChanged(value); }
    }

    private void DefaultPageChanged(string v)
    {
        // Service some...
    }
}

关于c# - WPF如何使用MVVM模式将值绑定(bind)到TextBox correclty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65396539/

相关文章:

c# - 将 Observable 集合写入 Csv 文件

c# - asp.net mobile网站添加文件上传控件?

c# - 通用字典上 IEqualityComparer<TKey> 的用例

winforms - 使用 ReactiveUI 和 Windows 窗体绑定(bind)到 ComboBox

c# - 绑定(bind) WindowsFormsHost 子属性

c# - 指定的消息不存在。错误代码 :MessageNotFound Prod-WorkerError Context

c# - 可观察集合中的事务支持

c# - WPF 应用程序中的 SendKeys.Send 方法

mvvm - Caliburn Micro 和跨应用程序共享 View 模型

c# - 验证标签内容等于 null 或 string.Empty