C# windows phone 8中未调用DependencyProperty属性
我之前发布了一个基于同一问题的问题,但我认为我应该从更准确的信息开始,因为我认为问题的根源有太多的因素,而这些因素实际上并不相关 我在windows phone应用程序中有一个C# windows phone 8中未调用DependencyProperty属性,c#,xaml,data-binding,windows-phone-8,binding,C#,Xaml,Data Binding,Windows Phone 8,Binding,我之前发布了一个基于同一问题的问题,但我认为我应该从更准确的信息开始,因为我认为问题的根源有太多的因素,而这些因素实际上并不相关 我在windows phone应用程序中有一个UserControl,我需要在其中添加一个属性,该属性将绑定到我的ViewModel中声明的属性。根据我在网上读到的内容和我的理解,我需要创建一个dependencProperty,以使其可绑定 public static readonly DependencyProperty SourceFileProperty =
UserControl
,我需要在其中添加一个属性,该属性将绑定到我的ViewModel
中声明的属性。根据我在网上读到的内容和我的理解,我需要创建一个dependencProperty
,以使其可绑定
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);
}
}
这是myViewModel中的属性:
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>
我在我的ViewModel
中的DocumentUri
的getter和setter以及UserControl
中的SourceFile
和dependencProperty
的定义上都有一个断点
当我运行代码时,会相应地调用DocumentUri
,dependencProperty
的定义也会初始化,但它从不调用我的UserControl
中SourceFile
属性的getter/setter
注意:如果将该属性定义为常规CLR属性,则会出现一个毫无意义的错误:
值不在预期范围内
我需要在更改DocumentUri
属性时“触发”SourceFile
属性
我做错了什么或错过了什么
谢谢。当从XAML获取/设置DP时,不会调用依赖属性getter和setter。那个这就是为什么你不应该在里面放任何代码
从链接:
其XAML处理器的当前WPF实现本质上是
依赖属性感知。WPF XAML处理器使用属性系统
加载二进制XAML和
正在处理作为依赖项属性的属性。这有效地
绕过属性包装。实现自定义依赖项时
属性,则必须说明此行为,并应避免
在属性包装器中放置除
属性系统方法GetValue和SetValue
您可以使用跟踪DP属性更改,只要从XAML或代码更改DP属性,就会调用该属性。谢谢,这很有效!我正要更新我的帖子,这时我看到你提供了答案!我发现这篇文章为我澄清了这一点。在它工作时,它破坏了我的xaml预览,并显示了以下异常:“对象引用未设置为对象的实例”。我应该为空性处理其他事情吗?不,不应该。尝试重建解决方案。您好,我通过添加以下检查修复了它:if(ViewControl!=null&&e.NewValue!=null){ViewControl.SourceFile=e.NewValue.ToString();}。谢谢。除非你想做动画,否则你不需要依赖属性。