Silverlight 3.0 Silverlight 3中的依赖属性和数据上下文
我正在使用Silverlight 3 beta版,我遇到了一个问题。我有一个页面,上面有一个用户控件。用户控件上有一个dependency属性。如果用户控件未定义数据上下文(因此使用父控件的数据上下文),则所有控件都可以正常工作。但是,如果用户控件有自己的数据上下文,则不会调用dependency属性的OnPropertyChanged方法 以下是一个示例: 我的主页:Silverlight 3.0 Silverlight 3中的依赖属性和数据上下文,silverlight-3.0,datacontext,dependency-properties,Silverlight 3.0,Datacontext,Dependency Properties,我正在使用Silverlight 3 beta版,我遇到了一个问题。我有一个页面,上面有一个用户控件。用户控件上有一个dependency属性。如果用户控件未定义数据上下文(因此使用父控件的数据上下文),则所有控件都可以正常工作。但是,如果用户控件有自己的数据上下文,则不会调用dependency属性的OnPropertyChanged方法 以下是一个示例: 我的主页: <UserControl x:Class="TestDepProp.MainPage" xmlns="h
<UserControl x:Class="TestDepProp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:app="clr-namespace:TestDepProp"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="100">
<Grid x:Name="LayoutRoot" Background="White">
<Border BorderBrush="Blue" BorderThickness="3" CornerRadius="3">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical">
<TextBlock Text="Enter text here:" />
<TextBox x:Name="entryBlock" Text="{Binding Data, Mode=TwoWay}"/>
<Button Content="Go!" Click="Button_Click" />
<TextBlock Text="{Binding Data}" />
</StackPanel>
<Border BorderBrush="Blue" BorderThickness="3" CornerRadius="3" Margin="5">
<app:TestControl PropOnControl="{Binding Data}" />
</Border>
</StackPanel>
</Border>
</Grid>
</UserControl>
主页的数据上下文:
using System.ComponentModel;
namespace TestDepProp
{
public class MainPageData:INotifyPropertyChanged
{
string _data;
public string Data
{
get
{
return _data;
}
set
{
_data = value;
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Data"));
}
}
public MainPageData()
{
Data = "Initial Value";
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}
using System.ComponentModel;
namespace TestDepProp
{
public class MyDataContext : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}
控制XAML:
<UserControl x:Class="TestDepProp.TestControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:app="clr-namespace:TestDepProp"
>
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel Orientation="Vertical" Margin="10" >
<TextBlock Text="This should change:" />
<TextBlock x:Name="ControlValue" Text="Not Set" />
</StackPanel>
</Grid>
</UserControl>
控件的数据上下文:
using System.ComponentModel;
namespace TestDepProp
{
public class MainPageData:INotifyPropertyChanged
{
string _data;
public string Data
{
get
{
return _data;
}
set
{
_data = value;
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Data"));
}
}
public MainPageData()
{
Data = "Initial Value";
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}
using System.ComponentModel;
namespace TestDepProp
{
public class MyDataContext : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}
要进行尝试,请在文本框中键入内容,然后单击“开始”按钮。注释掉控件代码中的数据上下文,以查看它是否开始工作
希望有人知道发生了什么事 用户控件的datacontext没有数据属性
因为它没有数据属性,数据绑定返回null,这已经是默认值,所以属性更改永远不会触发。我不明白这一点。为什么它需要有一个数据属性。并非所有DCs都有数据属性。我的所有VM类都没有数据属性。我甚至没有将任何东西绑定到子类上的DC。如果有绑定数据,它会告诉它查找数据属性。它看不到一个,结果是一个空值,它什么也不做。这与你的问题无关,但我想知道你为什么要使用Silverlight 3 Beta?Silverlight现在是版本5,那么为什么要在旧版本的测试版上工作呢?