WPF - 如何公开UserControl的子元素

时间:2009-11-19 22:01:37

标签: wpf xaml user-controls

我创建了一个XAML UserControl,用于使用一些向上/向下控件输入当前日期。 UserControl的有趣部分如下:

<UserControl x:Class="MyApp.Controls.DateEntry"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uControl="clr-namespace:MyApp.Controls"
xmlns:uConverters="clr-namespace:MyApp.Converters"
x:Name="dateEntry">

etc...
Here's where the numeric up/down controls are defined

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
    <uControl:NumericEntry x:Name="monthEntry" Label="Month" Style="{StaticResource SmallNumericEntry}" Maximum="12" Number="{Binding Path=Month, ElementName=dateEntry, Mode=TwoWay}" Minimum="1"/>
    <uControl:NumericEntry x:Name="dayEntry" Label="Day" Style="{StaticResource SmallNumericEntry}" Margin="10,0,0,0" Maximum="31" Number="{Binding ElementName=dateEntry, Path=Day, Mode=TwoWay}" Minimum="1"/>
    <uControl:NumericEntry x:Name="yearEntry" Label="Year" Style="{StaticResource LargeNumericEntry}" Margin="10,0,0,0" Maximum="9999" Number="{Binding ElementName=dateEntry, Path=Year, Mode=TwoWay}" Minimum="1"/>
</StackPanel>

您可以看到如何定义NumericEntries的某些属性(例如,对于yearEntry,Maximum =“9999”)。现在我想要做的是允许任何在他们的XAML代码中使用此UserControl的人能够修改此属性。这是一些使用此UserControl的XAML(单独文件):

<uControl:DateEntry
            x:Name="treatmentDate"
            Date="{Binding Source={StaticResource currentTreatment}, Path=Date, Mode=TwoWay}"
            Margin="10" />

我想将yearEntry.Maximum的值覆盖为2099.但是,在使用UserControl的XAML文件中,它没有对yearEntry的可见性。可以在.cs文件中以编程方式修改它,但这种定义肯定属于XAML文件。

提前感谢您的回复!

2 个答案:

答案 0 :(得分:3)

如果dateEntry类具有最大年份的依赖项属性,则可以从使用它们的任何控件绑定它们。然后你设置年份的代码就像这样

<uControl:NumericEntry 
  x:Name="yearEntry" 
  Label="Year" 
  Style="{StaticResource LargeNumericEntry}" 
  Margin="10,0,0,0" 
  Maximum="{Binding ElementName=dateEntry, Path=MaximumYear}" 
  Number="{Binding ElementName=dateEntry, Path=Year, Mode=TwoWay}" 
  Minimum="1"/>

在您的代码中,您可以在依赖关系道具定义中将max设置为9999

  public int MaximumYear {
     get { return (int)GetValue(MaximumYearProperty); }
     set { SetValue(MaximumYearProperty, value); }
  }

  public static readonly DependencyProperty MaximumYearProperty =
      DependencyProperty.Register("MaximumYear", typeof(int), typeof(NumericEntry), new UIPropertyMetadata(9999));

然后像这样使用它

<uControl:DateEntry
  x:Name="treatmentDate"
  Date="{Binding Source={StaticResource currentTreatment}, Path=Date, Mode=TwoWay}"
  MaximumYear="9999"
  Margin="10" />

答案 1 :(得分:1)

您希望在UserControl上外部可见的任何内容通常应该是该UserControl上的公共属性,事件等。除非极少数情况下,客户不应该深入了解UserControl的“胆量”来与他们合作。

在您的情况下,您应该在UserControl中声明MaximumYear类型为int的DependencyProperty。这是在代码隐藏中使用 - 用于VB的“wpfdp”模板或用于C#编辑器的“propdp”。 (键入模板缩写并按Tab键以获取可填写的模板)。

创建DependencyProperty后,您的UserControl的XAML可以绑定到它:

<uControl:NumericEntry x:Name="yearEntry" Maximum="{Binding MaximumYear, ...

您的客户可以将其用作普通媒体或XAML:

dateEntry.MaximumYear = 2010;

或在客户端代码的XAML中:

<uControl:DateEntry MaximumYear="2010" ...