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

时间:2016-03-18 12:52:17

标签: c# mvvm

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

xaml view

<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";
    }
}

模型库  public class ModelBase:INotifyPropertyChanged,IDisposable     {         ///         ///视图模型库的默认构造函数         ///         protected ModelBase()         {         }

    /// <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

string 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 个答案:

答案 0 :(得分:2)

您必须注意以下几点:

  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 Model 对象实例。因为如果没有,那么肯定View没有收到有关房产变更的通知。