Я пытаюсь создать собственный «TimePicker» - UserControl и немного борюсь с дизайном кода.

В XAML UserControl я создал ComboBox, который привязывается к свойству List<int> HoursList. Он будет содержать все числа от 0 до 23. Я хочу создать DependencyProperty Hour для отслеживания выбранного элемента ComboBox через привязку в другом файле XAML позже.

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);
    }
}

Если я сейчас использую Control в другом XAML-файле, он будет выглядеть так:

Test.xaml

<my:TimePicker Margin="2"  />

Моя проблема в том, что здесь я могу получить доступ к свойству HoursList. Но его следует использовать только для загрузки значений по умолчанию в элемент управления. Доступ должен быть возможен с DependencyProperty Hour позже .. Так что я хочу сохранить HoursList скрытым.

Вот пример, который я хочу запретить:

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

Возможно я неправильно понял механику .. Любые советы приветствуются!

0
wulf11 27 Мар 2019 в 14:07

1 ответ

Лучший ответ

Вы можете вообще не объявлять общедоступное свойство, а просто назначить ItemsSource ComboBox в коде позади:

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

Код:

public TimePicker()
{
    InitializeComponent();
    cbHours.ItemsSource = Enumerable.Range(0, 24);
}
1
Clemens 27 Мар 2019 в 11:35