我创建了一个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文件。
提前感谢您的回复!
答案 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" ...