为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法为已编译的绑定获取 UpdateSourceTrigger

有没有办法为已编译的绑定获取 UpdateSourceTrigger

C#
慕工程0101907 2022-12-24 10:40:21
我正在开发一个 UWP 应用程序,我意识到控件的默认UpdateSourceTrigger模式是,在使用已编译的绑定时无法更改。TextBoxLostFocus这意味着每当我想要为 a 更新绑定时TextBox,我都必须使用所有这些重复的样板:<TextBox    Text="{x:Bind ViewModel.Title, Mode=TwoWay}"    TextChanged="TextBox_OnTextChanged"/>private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e){    ViewModel.Title = ((TextBox)sender).Text;}现在,这还算不错,但是TextChanged每次TextBox使用 a 时都必须记住创建处理程序,这很烦人且容易出错。这适用于经典绑定:<TextBox Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>但是当然,这里会有 usinc 经典绑定的额外开销(涉及运行时反射等)。有没有办法获得相同的行为UpdateSourceTrigger=PropertyChanged?我完全可以接受,比如说,编写一个自定义附加属性来进行设置,只要我可以直接从 XAML 完成我需要的一切,而不涉及任何代码。谢谢!更新:( 回应 Nico Zhu - MSFT 的回答)对于我的测试,它运行良好。它根本不适合我,正如我已经多次说过的,使用UpdateSourceTriggerwithx:Bind是不可能的。它不编译,该属性在 XAML 编辑器中显示为红色,只是不存在。如果您说它对您有用,我真的不知道您在哪里尝试。我目前将 17763 作为最低目标,我可以 100% 保证这行不通。编译绑定与 {x:Bind} 语法一起使用,而不是经典绑定的 {Binding} 语法。我很清楚其中的区别,我已经多次提到了这一点,无论是在我这里的原始问题(也有代码片段)还是在我的评论中。它仍然使用通知接口(如 INotifyPropertyChanged)来监视更改正如我所说,我也知道这一点。但是同样,从这个问题来看,这根本不是这里的问题。问题不在于从视图模型到绑定属性的更新,而是从绑定属性(在本例中为 TextBox.Text)到视图模型的更新。{x:Bind}默认情况下是 OneTime 与 {Binding} 相比,后者是 OneWay。所以你需要为 {x:Bind} 声明绑定模式 OneWay 或 TwoWay。抱歉,但此时我不得不说,我开始怀疑您是否真的阅读了我最初的问题。我知道这一点,事实上您可以在我的两个原始代码片段中看到我已经Mode=TwoWay在我的两个绑定中使用了显式属性。再一次,这根本不是问题所在。重申一下:这里的问题是该TextBox.Text属性默认为LostFocus触发器,并且该UpdateSourceTrigger属性不可用于已编译的绑定。所以我想知道是否有一种方法可以实现相同的效果,使用编译绑定,仅在 XAML 中,而不必TextChanged每次都手动创建处理程序(如果没有,如果您计划最终将UpdateSourceTrigger属性添加到也编译绑定)。旁注:我并不是有意在这里表达不敬,我希望我们现在已经解决了我的问题中存在的误解。更新 #2:原来问题是由 ReSharper 插件引起的,该插件UpdateSourceTrigger在编译绑定中将属性标记为错误。我在这里打开了一个问题:https ://youtrack.jetbrains.com/issue/RSRP-474438
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

请检查UpdateSourceTrigger文档。

默认的 UpdateSourceTrigger 值为Default。并使用来自使用绑定的依赖项属性的默认行为。在 Windows 运行时中,这与带有 的值的计算结果相同PropertyChanged。如果您使用Text="{x:Bind ViewModel.Title, Mode=TwoWay}",标题将在文本更改时更改。我们不需要修改TextChanged偶数处理程序中的视图模式。


前提是我们需要INotifyPropertyChanged像下面这样实现。


public class HostViewModel : INotifyPropertyChanged

{

    private string nextButtonText;


    public event PropertyChangedEventHandler PropertyChanged = delegate { };


    public HostViewModel()

    {

        this.NextButtonText = "Next";

    }


    public string NextButtonText

    {

        get { return this.nextButtonText; }

        set

        {

            this.nextButtonText = value;

            this.OnPropertyChanged();

        }

    }


    public void OnPropertyChanged([CallerMemberName] string propertyName = null)

    {

        // Raise the PropertyChanged event, passing the name of the property whose value has changed.

        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

    }

}

有关更多详细信息,请参阅深度文档中的数据绑定。

更新

<TextBox Text="{x:Bind Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />根本不编译,正如我所说,UpdateSourceTrigger使用编译绑定时该属性根本不可用。

对于我的测试,它运行良好。Compiled Binding 与Classic Binding{x:Bind}语法相对的语法一起使用。{Binding}它仍然使用通知接口(如INotifyPropertyChanged)来监视更改,但{x:Bind}默认情况下是 OneTime ,{Binding}而 OneWay 是。所以你需要声明 bind Mode OneWayTwoWayfor {x:Bind}

Xaml

<StackPanel Orientation="Vertical">

    <TextBox Text="{x:Bind Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

    <TextBlock Text="{x:Bind Title, Mode=OneWay}" /> <!--declare bind mode-->

</StackPanel>

代码隐藏


public event PropertyChangedEventHandler PropertyChanged;


private void OnPropertyChanged([CallerMemberName] string propertyName = null)

{

    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

}

private string _title;

public string Title

{

    get

    {

        return _title;

    }

    set

    {

        _title = value;

        OnPropertyChanged();

    }

}


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号