我以前根据同样的问题发布了一个问题,但我想我会再次提供更准确的信息,因为我认为有太多因素导致问题的根源并不是真正相关的。
我在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
中的ViewModel
和SourceFile
中的UserControl
以及{DependencyProperty
的定义中有一个断点。 1}}。
当我运行我的代码时,相应地调用DocumentUri
,DependencyProperty
的定义也被初始化但它从不调用SourceFile
属性的getter / setter { {1}}。
注意:如果我将属性定义为常规CLR属性,我会收到一个没有意义的错误:
价值不在预期范围内
当UserControl
属性发生更改时,我需要SourceFile
属性被“触发”。
我做错了什么或错过了???
感谢。
答案 0 :(得分:1)
从XAML 获取/设置DP时,永远不会调用依赖属性 getter和setter。那就是为什么你不应该在那里放任何代码。
来自MSDN链接:
其XAML处理器的当前WPF实现本质上是 依赖属性意识到。 WPF XAML处理器使用属性系统 加载二进制XAML和时的依赖属性的方法 处理属性是依赖属性。这有效 绕过属性包装器。实现自定义依赖项时 属性,你必须考虑到这种行为,应该避免 将任何其他代码放在属性包装器中除了 属性系统方法GetValue和SetValue。
您可以使用PropertyChangedCallback来跟踪每当DP属性从XAML或代码更改时调用的DP属性更改。