none
一个关于数据绑定的问题 RRS feed

  • 问题

  • 我在页面加了一个

    <ProgressRing x:Name="probar" Grid.Row="1" Width="150" Height="150" IsActive="{Binding IsBusy}"/>

    在页面的LoadState中,这里就是用的那个默认模板

    var IsBusy = ListDataSource.getIsBusy();
    this.DefaultViewModel["IsBusy"] = IsBusy;

    在ListDataSource里:

    public static bool getIsBusy()
            {
                return _listDataSource.IsBusy;
            }
            private bool _isBusy=true;
            public bool IsBusy 
            {
                get { return this._isBusy; }
                set 
                {
                    _isBusy = value;
                    this.SetProperty(ref this._isBusy, value);
                }
            }

    结果程序运行的时候,数据加载完,IsBusy=false了,通过断点查看this.DefaultViewModel["IsBusy"] = IsBusy; 这里的IsBusy已经变成false了,但是界面上的进度环还在 不停转……

    是哪里还没设置好嘛……  

    顺便问一下,那个按住alt滑动滚轮切换成概览视图是用什么实现的?有这方面的资料咩?


    我的梦想这么大,我却离得这么远。

    2012年9月21日 2:15

答案

  • 你绑定的对象如果需要实现OneWay或者TwoWay的模式,必须实现INotifyPropertyChanged接口。这里你的ListDataSource应该是实现了这个接口,但是你绑定的只是一个bool值。而DefaultViewModel是没有实现这个接口的。

    所以你需要的是绑定到一个实现了INotifyPropertyChanged类的实例对象上,然后去修改这个对象的isbusy的属性。同时你的Xaml中绑定的路径也需要修改为{Binding IsBusy.isbusy}。

    为了区分你的属性和对象,所以我的属性用了全小写。


    Thanks! Damon.Tian

    2012年9月21日 4:39
  • DefaultViewModel是ObservableDictionary类型,支持通知功能,他的问题在于用一个静态方法传递了一个值类型,所以实际绑定到控件上的只是一个值,IsBusy改变虽然NotifyPropertyChanged了,但是并不会引起绑定更新,因为这个IsBusy 属性没有直接被绑定。

    你这么写试试:

    bool IsBusy;
    ListDataSource.getIsBusy(ref IsBusy);
    this.DefaultViewModel["IsBusy"] = IsBusy;
    ....
    public static void getIsBusy(ref bool isBusy)
    {
    	isBusy = _listDataSource.IsBusy;
    }
    private bool _isBusy=true;
    public bool IsBusy 
    {
    	get { return this._isBusy; }
    	set 
    	{
    		_isBusy = value;
    		this.SetProperty(ref this._isBusy, value);
    	}
    }

    那个按住alt滑动滚轮切换成概览视图是用什么实现的?有这方面的资料咩?

    是按住Control + 滚轮吧?  用 SemanticZoom http://msdn.microsoft.com/library/windows/apps/Hh702601 


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月21日 7:44
    版主

全部回复

  • 你绑定的对象如果需要实现OneWay或者TwoWay的模式,必须实现INotifyPropertyChanged接口。这里你的ListDataSource应该是实现了这个接口,但是你绑定的只是一个bool值。而DefaultViewModel是没有实现这个接口的。

    所以你需要的是绑定到一个实现了INotifyPropertyChanged类的实例对象上,然后去修改这个对象的isbusy的属性。同时你的Xaml中绑定的路径也需要修改为{Binding IsBusy.isbusy}。

    为了区分你的属性和对象,所以我的属性用了全小写。


    Thanks! Damon.Tian

    2012年9月21日 4:39
  • DefaultViewModel是ObservableDictionary类型,支持通知功能,他的问题在于用一个静态方法传递了一个值类型,所以实际绑定到控件上的只是一个值,IsBusy改变虽然NotifyPropertyChanged了,但是并不会引起绑定更新,因为这个IsBusy 属性没有直接被绑定。

    你这么写试试:

    bool IsBusy;
    ListDataSource.getIsBusy(ref IsBusy);
    this.DefaultViewModel["IsBusy"] = IsBusy;
    ....
    public static void getIsBusy(ref bool isBusy)
    {
    	isBusy = _listDataSource.IsBusy;
    }
    private bool _isBusy=true;
    public bool IsBusy 
    {
    	get { return this._isBusy; }
    	set 
    	{
    		_isBusy = value;
    		this.SetProperty(ref this._isBusy, value);
    	}
    }

    那个按住alt滑动滚轮切换成概览视图是用什么实现的?有这方面的资料咩?

    是按住Control + 滚轮吧?  用 SemanticZoom http://msdn.microsoft.com/library/windows/apps/Hh702601 


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月21日 7:44
    版主