1

次のサンプルでは、​​TextBoxに新しい文字列を入力してタブアウトすると、TextBlockは更新されますが、TextBoxは入力した値を保持し、変更された文字列で更新されます。この動作を変更する方法はありますか?

<Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">

        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}" Margin="106,240,261,187">
            <StackPanel>
                <TextBox Text="{Binding MyProp, Mode=TwoWay}"/>
                <TextBlock Text="{Binding MyProp}"/>
            </StackPanel>
        </Grid>
    </Page>

public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public ViewModel()
        {
            MyProp = "asdf";
        }

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
        protected bool SetField<T>(ref T field, T value, string propertyName)
        {
            if (EqualityComparer<T>.Default.Equals(field, value)) return false;
            field = value;
            OnPropertyChanged(propertyName);
            return true;
        }

        private string m_myProp;

        public string MyProp
        {
            get { return m_myProp; }
            set
            {
                m_myProp = value + "1";
                OnPropertyChanged("MyProp");
            }
        }
    }
4

1 に答える 1

2

あなたが見ている振る舞いは、いくぶん予想される振る舞いです。

テキストボックスからタブアウトすると、バインディングはMyPropセッターを呼び出します。OnPropertyChanged()を呼び出すと、元のバインディングのコンテキストにとどまり、他のバインディングのみに変更が通知されます。(これを確認するには、ゲッターにブレークポイントを設定し、OnPropertyChangedが呼び出された後に1回だけヒットすることを確認します。これに対する解決策は、最初のバインディングの更新が完了した後にOnPropertyChangedを呼び出すことです。これは、メソッドを呼び出すことで実現されます。非同期であり、それが戻るのを待っていません。

OnPropertyChanged( "MyProp")の呼び出しを次のように置き換えます。

Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, new 
Windows.UI.Core.DispatchedHandler(() => { OnPropertyChanged("MyProp"); }));
于 2012-12-01T04:46:12.833 に答える