在Windows Phone 8中没有调用DependencyProperty属性

时间:2014-03-30 18:44:08

标签: c# xaml data-binding windows-phone-8 binding

我以前根据同样的问题发布了一个问题,但我想我会再次提供更准确的信息,因为我认为有太多因素导致问题的根源并不是真正相关的。

我在Windows手机应用中有UserControl,我需要在其中添加一个属性,该属性将绑定到我ViewModel中声明的属性。从我在网上看到的内容和我理解的内容,我需要创建一个DependencyProperty以使其可绑定。

public static readonly DependencyProperty SourceFileProperty = DependencyProperty.
Register("SourceFile", typeof(string), typeof(ViewerControl), 
new PropertyMetadata(""));

public string SourceFile
{
    get
    {
         return base.GetValue(SourceFileProperty) as string;
    }
    set
    {
         base.SetValue(SourceFileProperty, value);
    }
}

这是我ViewModel中的属性:

public string DocumentUri
{
    get { return this._documentUri; }
    set
    {
        if (this._documentUri != value)
        {
            this.SetProperty(ref this._documentUri, value);
        }
    }
}

请注意,SetProperty需要INotifyPropertyChange,我的ViewModel肯定会被绑定,因为其他属性已被使用并正在正确更新,但这些属性并未绑定到我的用户控件。

这是我的XAML

<Grid Grid.Row="1">
    <StackPanel Orientation="Vertical">
        <cc:ViewerControl SourceFile="{Binding DocumentUri}" />
    </StackPanel>                        
</Grid>

我的DocumentUri中的ViewModelSourceFile中的UserControl以及{DependencyProperty的定义中有一个断点。 1}}。

当我运行我的代码时,相应地调用DocumentUriDependencyProperty的定义也被初始化但它从不调用SourceFile属性的getter / setter { {1}}。

注意:如果我将属性定义为常规CLR属性,我会收到一个没有意义的错误:

  

价值不在预期范围内

UserControl属性发生更改时,我需要SourceFile属性被“触发”。

我做错了什么或错过了???

感谢。

1 个答案:

答案 0 :(得分:1)

从XAML 获取/设置DP时,永远不会调用依赖属性 getter和setter。那就是为什么你不应该在那里放任何代码。

来自MSDN链接:

  

其XAML处理器的当前WPF实现本质上是   依赖属性意识到。 WPF XAML处理器使用属性系统   加载二进制XAML和时的依赖属性的方法   处理属性是依赖属性。这有效   绕过属性包装器。实现自定义依赖项时   属性,你必须考虑到这种行为,应该避免   将任何其他代码放在属性包装器中除了   属性系统方法GetValue和SetValue。

您可以使用PropertyChangedCallback来跟踪每当DP属性从XAML或代码更改时调用的DP属性更改。