【问题标题】:how to notify a view that a property has changed?如何通知视图属性已更改?
【发布时间】:2012-06-09 05:11:41
【问题描述】:

我有一个 PopUp 控件,其 IsOpen 属性绑定到实现 INotifyPropertyChanged 的​​ ViewModel 中名为 IsOpen 的属性,我希望 PopUp 控件根据 ViewModel 的 IsOpen 值自动关闭或打开,我使用 MVVM模式,代码如下:

ViewModel 中的代码:

public class MainViewModel : ViewModelBase
{

    private  bool _isOpen;
    public bool IsOpen
    {
        get
        {

            return this._isOpen;
        }

        set
        {
            if (this._isOpen != value)
            {
                this._isOpen = value;
                RaisePropertyChanged("IsOpen");
            }
        }
    }

}

视图中的代码: //Main是下面MainViewModel的一个实例

弹出 x:Name="popUp" IsOpen="{Binding Main.IsOpen}"

当然,ViewModel 中有一个方法用于更改 IsOpen 属性,我可以清楚地看到它的更改,但它没有通知视图,我错过了什么吗?提前谢谢。

【问题讨论】:

    标签: windows-phone-7 inotifypropertychanged


    【解决方案1】:

    我将为该弹出窗口创建一个用户控件,并为该控件创建一个 VM。然后我将创建该用户控件和 VM 的实例,并从我的主视图模型中显示它。这样您也可以控制弹出窗口的视图模型。

    如果你只想显示一个基本的弹出窗口,这个解决方案就是过度设计。

    public class Popup: UserControl
    {
    
         public Popup(PopupVM model)
         {
             this.DataContext = model;
         }
    }
    
    public class PopupVM
    {
    ...
    }
    
    public class MainViewModel : ViewModelBase
    {
    ....
    
    // Called with an IAction
    private void ShowPopup()
    {
       PopupVM model = new PopupVM();
       this.popup = new Popup(model); // Control is a field in this VM.
       popup.Show();
    }
    
    private void ClosePopup()
    {
        // Gather some info if you want
        this.popup.Close();
    }
    }
    

    【讨论】:

    • 谢谢你。我发现了问题,我犯了一个错误,我认为 PopUp 没有改变它的状态,实际上当我在 ViewModel 中定义的 IsOpen 属性改变了它的值时它确实改变了,我只是没有看到PopUp控件,我真是个笨蛋!非常感谢你,祝你有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多