Как обрабатывать видимость свойств в UserControl? - PullRequest
0 голосов
/ 27 марта 2019

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

В XAML UserControl я создал ComboBox, который связывается с List<int> HoursList -свойством. Это будет содержать все числа от 0 до 23. Я хочу создать DependencyProperty Hour для отслеживания выбранного элемента ComboBox через Binding в другом файле 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-Property здесь. Но его следует использовать для загрузки значений по умолчанию только в элементе управления. Доступ должен быть возможен с DependencyProperty Hour позже .. Так что я хочу скрыть HoursList.

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

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

Может быть, я не правильно понял механику .. любой совет ценится!

1 Ответ

1 голос
/ 27 марта 2019

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

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

Код:

public TimePicker()
{
    InitializeComponent();
    cbHours.ItemsSource = Enumerable.Range(0, 24);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...