INotifyPropertyChanged,没有UI更新

时间:2011-09-30 15:09:26

标签: silverlight inotifypropertychanged

我环顾网络寻找答案,但似乎无法让它发挥作用。这就是我所拥有的:

public class UIValues : INotifyPropertyChanged
    {
        private double zoomValue = 1;

        private static readonly UIValues instance = new UIValues();

        public event PropertyChangedEventHandler PropertyChanged;

        internal static UIValues Instance { get { return instance; } }

        internal double ZoomValue
        {
            get { return zoomValue; }
            set
            {
                if (this.zoomValue == value)
                    return;

                this.zoomValue = value;
                this.OnPropertyChanged(new PropertyChangedEventArgs("ZoomValue"));
            }
        }

        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, e);
        }
    }

然后我有了这个:

<UserControl>
    <UserControl.DataContext>
            <local:UIValues x:Name="uiValues"/>
        </UserControl.DataContext>

.
.
.

                <Viewbox x:Name="vbViewBox" RenderTransformOrigin="0.5,0.5">
                    <local:ImageControl x:Name="imgControl" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    <Viewbox.RenderTransform>
                            <TransformGroup>
                                    <CompositeTransform x:Name="trCompositeTransform" ScaleX="{Binding ZoomValue}" ScaleY="{Binding ZoomValue}" Rotation="0" SkewX="0" SkewY="0"/>
                            </TransformGroup>
                    </Viewbox.RenderTransform>
                </Viewbox>
</UserControl>

所以基本上,每当我从代码隐藏中更改UIValues类的ZoomValue时,UI都不会更新。

任何人都知道为什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

查看发布的代码,我猜你有类似的东西来改变缩放值。

  UIValues.Instance.ZoomValue = x;

问题是这个xaml: -

  <local:UIValues x:Name="uiValues"/> 

构造一个独立的UIValues实例,它与静态Instance属性返回的实例不同。因此,您将更改没有任何内容正在侦听的对象的值。

修改

ZoomLevel也是internal,因为绑定工作必须是公开的。

解决方案是使用IApplicationService并通过App.xaml执行操作。

将课程改为:

public class UIValues : INotifyPropertyChanged,  IApplicationService
{
    private double zoomValue = 1;

    public event PropertyChangedEventHandler PropertyChanged;

    internal static UIValues Instance { get; private set; }

    public double ZoomValue
    {
        get { return zoomValue; }
        set
        {
            if (zoomValue == value)
                return;

            zoomValue = value;
            this.OnPropertyChanged(new PropertyChangedEventArgs("ZoomValue"));
        }
    }

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, e);
    }

    void IApplicationService.StartService(ApplicationServiceContext context)
    {
        Instance = this;
        Application.Current.Resources.Add("UIValues", Instance);
    }

    void IApplicationService.StopService() { }
}

UIValues的实例添加到App.Xaml: -

<Application.ApplicationLifetimeObjects>
    <local:UIValues />
</Application.ApplicationLifetimeObjects>

然后像这样设置用户控件DataContext: -

<UserControl ... DataContext="{StaticResource UIValues}"> 

这就是浪费你可能需要绑定到实际数据的DataContext。您可以直接在绑定上指定Source: -

 <CompositeTransform ScaleX="{Binding ZoomValue, Source={StaticResource UIValues}}" ScaleY="{Binding ZoomValue, Source={StaticResource UIValues}}" Rotation="0" SkewX="0" SkewY="0"/>

答案 1 :(得分:0)

ZoomValue属性的访问修饰符更改为public,一切正常。