亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法為已編譯的綁定獲取 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 關注
  • 93 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號