背景
正如标题所述,我有一个自定义用户控件。我正在使用 Silverlight 4,但我很确定这也适用于 WPF。目标是创建一个控件,该控件将为开发人员提供选项,以仅显示他们希望在特定页面上显示的控件部分,以及格式、对齐方式、控件替代文本和方向属性。
要展示的部分是:
- Country
- SubdivisionCategory(州、区、边远地区)
- SubdivisionCensusRegion(东北,南部,中西部,西部)
- SubdivisionCensusDivision(东北中、东中南等)
- Subdivision
我只是试图访问当 DEV 在 XAML 中创建此控件的实例时设置的属性的值。DependencyProperty我已经为我认为用于此目的的每个属性设置了自定义对象。
问题
我的问题是,SetMargins()所有this.ShowXxx属性都等于方法签名new PropertyMetadata(true)部分中设置的值。DependencyProperty.Register因此,没有正确设置边距。
问题
如何获取this.ShowXxx属性的初始 XAML 值或我在 XAML 中设置的任何其他属性?
代码
下面是 XAML 标记的示例:
<local:CountryAndSubdivisionFilter 
    x:Name="ReportSettingsCountryAndSubdivisionFilter"
    Orientation="Horizontal"
    CountryFormat="Name"
    SubdivisionFormat="Name"
    ShowCountry="False"
    ShowSubdivisionCategory="False"
    ShowSubdivisionCensusRegion="False"
    ShowSubdivisionCensusDivision="True"
    ShowSubdivision="True"
    SubdivisionCensusDivisionText="Region"
    SubdivisionText="State"
    Margin="0,15,0,0" />
ShowCountry这是该属性的示例:
#region ShowCountry
public static readonly DependencyProperty ShowCountryProperty = DependencyProperty.Register
(
    "ShowCountry",
    typeof(bool),
    typeof(CountryAndSubdivisionFilter),
    new PropertyMetadata(true)
);
public bool ShowCountry
{
    get
    {
        return (bool) GetValue(ShowCountryProperty);
    }
    set
    {
        SetValue(ShowCountryProperty, value);
        this.CountryStackPanel.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
        this.SetMargins();
    }
}
#endregion
这是SetMargins()方法:
private void SetMargins()
{
    this.CountryStackPanel.Margin = new Thickness(0);
    this.SubdivisionCategoryStackPanel.Margin = new Thickness(0);
    this.SubdivisionCensusRegionStackPanel.Margin = new Thickness(0);
    this.SubdivisionCensusDivisionStackPanel.Margin = new Thickness(0);
    this.SubdivisionStackPanel.Margin = new Thickness(0);
    var spList = new List<StackPanel>();
    if (this.ShowCountry)
        spList.Add(this.CountryStackPanel);
    if (this.ShowSubdivisionCategory)
        spList.Add(this.SubdivisionCategoryStackPanel);
    if (this.ShowSubdivisionCensusRegion)
        spList.Add(this.SubdivisionCensusRegionStackPanel);
    if (this.ShowSubdivisionCensusDivision)
        spList.Add(this.SubdivisionCensusDivisionStackPanel);
    if (this.ShowSubdivision)
        spList.Add(this.SubdivisionStackPanel);
    int spIndex = 1;
    foreach(var sp in spList)
    {
        var i = (spIndex < spList.Count) ? 15 : 0;
        var j = (spIndex == 1) ? 0 : 15;
        sp.Margin = (this.Orientation == Orientation.Horizontal)
                        ? new Thickness(0, 0, i, 0) 
                        : new Thickness(0, j, 0, 0);
        spIndex++;
    }
}