问题是DependencyProperty没有被分配到XAML中指定的值:
我有两个不同的用户控件让我们说UserControl1和UserControl2定义另一个控件共用的另一个用户控件:
UserControl1.xaml:
<modulename:MyUserControl ....somecode... DataOrientation="Horizontal">
</modulename:MyUserControl>
UserControl2.xaml
<modulename:MyUserControl ....somecode... DataOrientation="Vertical">
</modulename:MyUserControl>
两个UserControl之间的区别在于UserControl1必须使用水平方向显示数据,而UserControl2必须使用垂直方向显示数据。
在MyUserControl的代码背后,我定义了一个依赖属性,如下所示:
public static readonly DependencyProperty DataOrientationProperty =
DependencyProperty.Register ("DataOrientation",typeof(String),typeof(MyUserControl));
public String DataOrientation
{
get {return (String)GetValue(DataOrientationProperty);}
set { SetValue(DataOrientationProperty, value); }
}
这些是MyUserControl.xaml内部代码的片段:
...
<StockPanel>
<Grid Name="MyGrid" SizeChanged="MyGrid_SizeChanged">
<Grid.ColumnDefinitions>
<ColumnDefinitions Width="*"/>
<ColumnDefinitions Width="100"/>
</Grid.ColumnDefinitions>
<ScrollViewer Name="MySV" Grid.Column="0" ....>
<Grid Name="DetailGrid"/>
</ScrollViewer>
<Grid Grid.Column="1" .........>
......Some Option Data....
</Grid>
</Grid>
</StockPanel>
我们的想法是根据方向标志将ColumnDefinitions更改为RowDefinitions,将Grid.Column更改为Grid.Rows:
如果标志为“水平”,UserControl会并排显示“DetailsGrid”和“Option Data”网格,这意味着“DetailGrid”位于第0列,“Option Data”网格位于第1列。
如果标志为“Vertical”,UserControl在第1行显示“DetailGrid”,在第0行显示“Option Data”。
在这个问题上需要一些帮助。
提前谢谢。
答案 0 :(得分:1)
两件事,使依赖属性具有更改的处理程序,并在调试器中验证该值实际上是否为用户控件。还要为用户控件设置默认值(下面使用“水平”),但您决定如何处理它。
public string DataOrientation
{
get { return (string)GetValue(DataOrientationProperty); }
set { SetValue(DataOrientationProperty, value); }
}
/// <summary>
/// Identifies the DataOrientation dependency property.
/// </summary>
public static readonly DependencyProperty DataOrientationProperty =
DependencyProperty.Register(
"DataOrientation",
typeof(string),
typeof(MyClass),
new PropertyMetadata("Horizontal", // Default to Horizontal; Can use string.Empty
OnDataOrientationPropertyChanged));
/// <summary>
/// DataOrientationProperty property changed handler.
/// </summary>
/// <param name="d">MyClass that changed its DataOrientation.</param>
/// <param name="e">Event arguments.</param>
private static void OnDataOrientationPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyClass source = d as MyClass; // Put breakpoint here.
string value = (string)e.NewValue;
}