0

ビューに DataContext が ViewModel にバインドされている状況がありますが、ビュー内のコントロールの 1 つに DataContext が ViewModel のプロパティに設定されています。そのViewModelを初めて変更すると、変更が表示されますが、その後、ViewModel内のプロパティを変更しても、変更はビューに反映されません。

//Somewhere inside my View
            <TaicoControl:FlashMessage DataContext="{Binding FlashMessage}"
                                   DockPanel.Dock="Top"
                                   FadesOutAutomatically="True"
                                   FontFamily="BPG Arial"
                                   Message="{Binding Message}"
                                   MessageType="{Binding FlashType}" />
//End of the View




public sealed class ShellViewModel : ViewModelBase
{

    public FlashMessageModel FlashMessage { get; private set; }

    protected override void SetupEvents()
    {
        RegisterForEvent<SystemBaloonRequiered>(OnBaloonRequest);
        RegisterForEvent<FlashRequest>(OnFlashRequested);
        base.SetupEvents();
    }

    #region Message Handlers


    private void OnFlashRequested(FlashRequest obj)
    {
        FlashMessage = null;
        FlashMessage = new FlashMessageModel { Message = obj.Message, FlashType = obj.FlashType };
        RaisePropertyChanged(() => FlashMessage);
    }

 }
4

1 に答える 1

1

説明:

これは、INotifyPropertyChangedインターフェイスを実装しない典型的なケースです。

FlashMessageの値を変更しても、UI がそれを認識する方法はありません。したがって、UI に知らせるには、プロパティ名 (この場合は「FlashMessage」) でPropertyChangedイベントを発生させます。

INotifyPropertyChangedインターフェイスを実装し、 FlashMessageのプロパティの変更を通知すると、問題なく動作するはずです。

例:

public sealed class ShellViewModel : ViewModelBase, INotifyPropertyChanged
{ 
    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        var temp = PropertyChanged;

        if(temp != null)
        {
            temp(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public FlashMessageModel _flashMessage;

    public FlashMessageModel FlashMessage 
    { 
        get { return _flashMessage; } 
        private set 
        { 
            _flashMessage = value;
            RaisePropertyChanged("FlashMessage");
        }
    } 
}

-編集-

コードを次のように変更してみてください。

FlashMessage = null;   
FlashMessage = new FlashMessageModel { Message = obj.Message, FlashType = obj.FlashType };   
RaisePropertyChanged(() => FlashMessage);   

次へ:

FlashMessage.Message = obj.Message;
FlashMessage.FlashType = obj.FlashType;
于 2012-10-18T17:38:39.937 に答える