如何处理用户控件中属性的可见性?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理用户控件中属性的可见性?相关的知识,希望对你有一定的参考价值。

我尝试创建一个自定义的“TimePicker” - UserControl并且在代码设计上有点挣扎。

在UserControl的XAML中,我创建了一个ComboBox,它绑定到List<int> HoursList属性。这将包含0-23之间的所有数字。我想创建一个DependencyProperty Hour,以便稍后通过Binding在另一个XAML文件中跟踪所选的ComboBox项。

TimePicker.xaml

<Grid>
    <!--Hours-->
    <ComboBox Grid.Column="0" ScrollViewer.CanContentScroll="False"
            ItemsSource="{Binding HoursList,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
            SelectedIndex="0" ItemStringFormat="{}{0:00}">
    </ComboBox>
</Grid>

TimePicker.xaml.cs

public partial class TimePicker : UserControl
{
    private List<int> hoursList;
    public readonly List<int> HoursList
    {
        get 
        {
            if (this.hoursList == null)
                LoadHoursList();

            return hoursList; 
        }
    }

    public TimePicker()
    {
        InitializeComponent();
    }

    /// <summary>
    /// will create a new List<int> and fill it from 0-23 (int) representing the hours 
    /// </summary>
    private void LoadHoursList()
    {
        this.hoursList = new List<int>();

        for (int i = 0; i < 24; i++)
            this.HoursList.Add(i);
    }
}

如果我现在在另一个XAML文件中使用Control,它将如下所示:

Test.xaml

<my:TimePicker Margin="2"  />

我的问题是我可以在这里访问HoursList-Property。但它应该用于仅加载控件中的默认值。应该可以在以后使用DependencyProperty Hour进行访问。所以我想隐藏HoursList。

这是一个我想要禁止的例子:

<my:TimePicker Margin="2" HoursList="" />

也许我没有正确理解机制..任何建议表示赞赏!

答案

您可能根本不会声明公共属性,只需在代码后面分配ComboBox的ItemsSource:

<ComboBox x:Name="cbHours" .../>

码:

public TimePicker()
{
    InitializeComponent();
    cbHours.ItemsSource = Enumerable.Range(0, 24);
}

以上是关于如何处理用户控件中属性的可见性?的主要内容,如果未能解决你的问题,请参考以下文章

“私有”可见性修饰符 - 将 C# 转换为 VB 时如何处理差异?

如何处理自定义 android 视图/小部件的可见性更改

Xamarin 表单:如何处理 flowlistview 所选项目的可见性?

如何处理表单提交而不对用户可见重定向

如何处理数据仓库中用户可以更改的代码表属性

Vue 组件 - 如何处理非反应性数据?