标签不会改变,即使模型改变了 mvvm 中的值

  • 本文关键字:改变 mvvm 模型 标签 c# mvvm
  • 更新时间 :
  • 英文 :


有人可以告诉我我犯了什么错误吗?视图中的标签不会更改,即使 Error.ErroMsg 已更改。

XAML 视图

<Label
  x:Name="ErrorMsg"
  Content="{Binding Path=Error.ErrorMsg, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  Grid.Column="0"
  HorizontalAlignment="Left"
  VerticalAlignment="Bottom"
  Width="200"
  Height="26"/>

查看模型

private ErrorModel error = new ErrorModel();
public ErrorModel Error
{
    get { return error; }
    set { error = value; }
}
// This method will be called by a state machine using a delegate
public void displayErrorMessage(string message)
{
    Error.ErrorMsg = message;
    CommandManager.InvalidateRequerySuggested();
    logger.Trace(" Successfully displayed the error message");
}

// ModelBase inherited by INotifyPropertyChanged and IDisposable
class ErrorModel : ModelBase
{
    private string errorMsg;
    public string ErrorMsg
    {
        get { return errorMsg; }
        set { errorMsg = value; OnPropertyChanged("ErrorMsg"); }
    }
    public ErrorModel() {
        errorMsg = "TestHello";
    }
}

模型库 公共类模型库:INotifyPropertyChanged,IDisposable { /// 视图模型库的默认构造函数 /// 受保护的模型库() { }

    /// <summary>
    /// Initialized property changed event handler
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;
    /// <summary>
    /// This function will call by public setters of the model class
    /// </summary>
    /// <param name="propertyName">Specific property name that needs to identify unique model member</param>
    protected virtual void OnPropertyChanged(string propertyName)
    {
        // Initialize handler by using property changed event handler delegate
        PropertyChangedEventHandler handler = this.PropertyChanged;
        // Check that current handler is available or not
        if (handler != null)
        {
            // Initialize property changed event args
            var propertyChangedEventArgs = new PropertyChangedEventArgs(propertyName);
            // Call back using property changed event handler
            handler(this, propertyChangedEventArgs);
        }     
    }
    /// <summary>
    /// This is calle when leaving the view model
    /// </summary>
    public void Dispose()
    {
        this.OnDispose();
    }
    /// <summary>
    /// Model dependent data is cleared here
    /// </summary>
    protected virtual void OnDispose() { }
}

通过委托调用 displayErrorMessage

字符串 cpDoesntWorkError ="充电点不可用"。 this.uiDelegator.showErrorMessage(cpDoesntWorkError);

GUIDelegator

 public delegate void DisplayErrorMessageDelegate(string message);    
 /// <summary>
        /// This will register the ErrorMesssage delegate passed by the RCU_GUI
        /// </summary>
        /// <param name="del">ErrorMessageDelegate object which need to registered will be passed</param>
        public void setDisplayErrorMessageDelegate(DisplayErrorMessageDelegate del)
        {
            displayErrorMessageDelegate = del;
            logger.Trace("Error message delegate successfully set by RCU_GUI");
        }
        /// <summary>
        /// Call back to the displayErrorMessage which is in RCU_GUI
        /// </summary>
        /// <param name="message">Error message need to be displayed</param>
        /// <returns></returns>
        public void showErrorMessage(string message)
        {
            // If the error message delegate is not null
            if (displayErrorMessageDelegate != null)
            {
                logger.Trace("Displaying the error message");
                displayErrorMessageDelegate(message);
            }
            else
                logger.Trace("null display error message delegate");
        }

你必须注意几件事:

  1. 您的方法是否OnPropertyChanged ModelBase正确引发PropertyChanged事件

  2. 在属性Error视图模型中,您不会通知视图此属性已更改。然后,在调用该方法之前,其他一些代码可能会分配新的ErrorModel实例displayErrorMessage。由于该视图不知道Error属性已更改,因此它仍然显示TestHello字符串。如果是这种情况,您可以修改视图模型

    public ErrorModel Error
    {
        get { return error; }
        set { error = value; OnPropertyChanged("Error"); }
    }
    
  3. 调用该方法displayErrorMessage委托必须使用分配给 View 属性DataContext视图模型对象实例。因为如果没有,那么View肯定不会收到有关属性更改的通知。

最新更新