none
Bob,关于对于DownLoadBitmap Demo的不理解: RRS feed

  • 问题

  • Bob你好,20121016_DownloadImage Demo后我有不少疑惑:

    主要的部分在于

            protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
            {
                if (object.Equals(storage, value)) 
                    return false;
    
                storage = value;
                this.OnPropertyChanged(propertyName);
                return true;
            }

    SetProperty时候为什么需要这样写呢?之前很多如下:

    if (PropertyChanged!= null)
        PropertyChanged(propertyName);
    set { this.SetProperty(ref _image, value); }

    而且在SetProperty中有三个参数但在之后设置属性调用此方法中只有2个参数如上:

    估计我没理解其中的用法,还包括其中[CallerMemberName]这个很少见不理解;

    此外booleanToVisibilityConvert中:

            public object Convert(object value, Type targetType, object parameter, string language)
            {
                if (parameter != null && (parameter.ToString().ToUpper() == "NEGATION" || parameter.ToString().ToUpper() == "NEG"))
                    return (value is bool && (bool)value) ? Visibility.Collapsed : Visibility.Visible;
                else
                    return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;
            }

    Bob你if里的语句判断,我不理解是什么意思?

    最后还有在

            private BitmapImage _image;
            public BitmapImage Image
            {
                get
                {
                    CoreWindow coreWindow = CoreWindow.GetForCurrentThread();
                    if (coreWindow != null && coreWindow.Dispatcher.HasThreadAccess)
                    {
                        if (_image == null)
                            _image = new BitmapImage();
                        _image.DownloadProgress -= Image_DownloadProgress;
                        _image.DownloadProgress += Image_DownloadProgress;
                    }
                    return _image;
                }
                set { this.SetProperty(ref _image, value); }
            }

    CoreWindow coreWindow = CoreWindow.GetForCurrentThread();
    if (coreWindow != null && coreWindow.Dispatcher.HasThreadAccess)

    这里有此判断,我注释之后依然正常运行;请问一般在何时添加这个判断呢?对于我以后的使用可以更有帮助,谢谢bob了!!!



    2012年10月17日 1:09

答案

  • 第一个问题,主要是在CallerMemberName上,这是.Net4.5中新加入的,主要是为了处理INotifyPropertyChanged接口的问题。

    我们在binding的时候,数据源为了要实现通知,就需要实现INotifyPropertyChanged接口,在4.5之前,我们实现这个接口的时候需要传递一个属性的显示字符串名进去,或者使用表达式树来处理,使用这个新特性,可以简化你的数据类的实现。

    第二个问题,if判断中使用了第三个参数,你应该可以看到在Xaml中binding的时候是可以设置ConverterParameter, 通过这个ConverterParameter来控制Converter的逻辑, 而ConverterParameter在converter中就是第三个参数。

    第三个问题,if判断是为了保证没有非空引用和线程可用,虽然你注释掉可以运行,但是不安全。就比如,String s; s.toString(),当你s不为null的时候都不会异常,但是如何保证s不为null呢?一般就会加上判断,然后再调用方法。


    Thanks! Damon.Tian

    2012年10月17日 4:15
  • if (parameter != null && (parameter.ToString().ToUpper() == "NEGATION" || parameter.ToString().ToUpper() == "NEG"))

    不好意思,这个if判断中的后2个判断条件我还是没很理解;

    我在Debug的时候parameter最初会为空然后进入else的判断语句:

    if (parameter != null && (parameter.ToString().ToUpper() == "NEGATION" || parameter.ToString().ToUpper() == "NEG"))
                    return (value is bool && (bool)value) ? Visibility.Collapsed : Visibility.Visible;
    else
                    return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;

    不知道为什么会需要这个几个判断条件呢?谢谢指教

    其他几个回答我都已经了理解了,谢谢你哦!


    2012年10月17日 4:50
  • 谢谢已经理解了!!!

    2012年10月17日 5:56

全部回复

  • 第一个问题,主要是在CallerMemberName上,这是.Net4.5中新加入的,主要是为了处理INotifyPropertyChanged接口的问题。

    我们在binding的时候,数据源为了要实现通知,就需要实现INotifyPropertyChanged接口,在4.5之前,我们实现这个接口的时候需要传递一个属性的显示字符串名进去,或者使用表达式树来处理,使用这个新特性,可以简化你的数据类的实现。

    第二个问题,if判断中使用了第三个参数,你应该可以看到在Xaml中binding的时候是可以设置ConverterParameter, 通过这个ConverterParameter来控制Converter的逻辑, 而ConverterParameter在converter中就是第三个参数。

    第三个问题,if判断是为了保证没有非空引用和线程可用,虽然你注释掉可以运行,但是不安全。就比如,String s; s.toString(),当你s不为null的时候都不会异常,但是如何保证s不为null呢?一般就会加上判断,然后再调用方法。


    Thanks! Damon.Tian

    2012年10月17日 4:15
  • if (parameter != null && (parameter.ToString().ToUpper() == "NEGATION" || parameter.ToString().ToUpper() == "NEG"))

    不好意思,这个if判断中的后2个判断条件我还是没很理解;

    我在Debug的时候parameter最初会为空然后进入else的判断语句:

    if (parameter != null && (parameter.ToString().ToUpper() == "NEGATION" || parameter.ToString().ToUpper() == "NEG"))
                    return (value is bool && (bool)value) ? Visibility.Collapsed : Visibility.Visible;
    else
                    return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;

    不知道为什么会需要这个几个判断条件呢?谢谢指教

    其他几个回答我都已经了理解了,谢谢你哦!


    2012年10月17日 4:50
  • 1. 首先[CallerMemberName]这个特性可以将调用处的成员名传递给调用者,这个是.Net 4.5新增的,包括CallerMemberName CallerLineNumberCallerFilePath

    所以在SetProperty的实现中,第三个参数就不需要显式地传递。这个实现在VS 2012 Grid App 的模板中 Common\BindableBase.cs 就是这么实现。我们这样就可以简单的去实现每个Model 属性的Set方法。

    2. booleanToVisibilityConvert 是我自己修改实现的,我添加了反义转换,如果使用时候是Converter={StaticResource booleanToVisibilityConverter} 没有带有参数,则是true转换为Visible, false为Collapsed

    如果使用时候添加了参数 Converter={StaticResource booleanToVisibilityConverter}, ConverterParameter=NEG 或者 NEGATION。 则是true对应Collapsed, false对应Visible

    3. 因为我们必须在UI主线程创建BitmapImage和使用BitmapImage, 所以需要coreWindow.Dispatcher 将代码回调到UI主线程使用,这里的判断主要防止由于在异步操作中可能引起后台任务线程去创建BitmapImage而引起异常。一旦是后台任务线程在调用创建BitmapImage,则coreWindow.Dispatcher.HasThreadAccess为false,跳过创建BitmapImage。


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

    2012年10月17日 5:00
    版主
  • 谢谢已经理解了!!!

    2012年10月17日 5:56