如何处理 UserControl 中属性的可见性?

Posted

技术标签:

【中文标题】如何处理 UserControl 中属性的可见性?【英文标题】:How to handle visibilty of properties in an UserControl? 【发布时间】:2019-08-17 22:24:06 【问题描述】:

我尝试创建一个自定义的“TimePicker” - UserControl,并在代码设计方面遇到了一些困难。

在 UserControl 的 XAML 中,我创建了一个 ComboBox,它绑定到 List<int> HoursList-property。这将包含从 0 到 23 的所有数字。我想创建一个DependencyProperty Hour,以便稍后通过绑定在另一个 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 文件中使用控件,它将如下所示:

Test.xaml

<my:TimePicker Margin="2"  />

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

这是我要禁止的示例:

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

也许我没有正确理解机制..任何建议都是适用的!

【问题讨论】:

请注意,您的 HoursList 属性声明不需要更多:public List&lt;int&gt; HoursList get; = Enumerable.Range(0, 24).ToList(); 感谢这个! 【参考方案1】:

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

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

代码:

public TimePicker()

    InitializeComponent();
    cbHours.ItemsSource = Enumerable.Range(0, 24);

【讨论】:

这不会破坏我的“MVVM”方法吗?这让我经常有点困惑..决定我是否在代码隐藏中做这些事情.. 不,在 UserControl 中有或没有内部属性与 MVVM 无关。您甚至可以决定在 XAML 中添加 24 小时项目... 好的,我将删除 HoursList 属性并在代码隐藏中设置 ItemsSource!谢谢

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

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

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

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

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

WPF - 将 UserControl 可见性绑定到属性

如何将 WPF DataGrid DataColumns 可见性绑定到 UserControl 的 ViewModel 上的属性?