Пользовательский контроль данных WPF - PullRequest
0 голосов
/ 23 марта 2011

Я новичок в разработке пользовательских элементов управления в WPF, но я попытался разработать один для использования в приложении, которое я разрабатываю.Этот элемент управления представляет собой текстовое поле автозаполнения.В этом элементе управления у меня есть DependencyProprety, в котором есть список возможных записей, которые можно выбрать при вводе текста

public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource",typeof (IList<object>),typeof (AutoCompleteTextBox),new PropertyMetadata(null));
        public IList<object> ItemsSource
        {
            get { return (IList<object>) GetValue(ItemsSourceProperty); }
            set
            {
                SetValue(ItemsSourceProperty, value);
                RaiseOnPropertyChanged("ItemsSource");
            }
        }

. Я использую этот элемент управления в пользовательском контроле и связываю его со свойствомв viewmodel

<CustomControls:AutoCompleteTextBox Height="23" Width="200" 
        VerticalAlignment="Center" Text="{Binding Path=ArticleName, Mode=TwoWay,                  
        UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Path=Articles, 
        Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
</CustomControls:AutoCompleteTextBox>

У меня есть view-модель, которую я назначаю при загрузке usercontrol для datacontext из usercontrol load

protected virtual void Window_Loaded(object sender, RoutedEventArgs e)
        {
            if (!DesignerProperties.GetIsInDesignMode(this))
            {
                this.DataContext = viewModel;
                SetLabels();
            }
        }

Эта модель представления имеет свойство Articles со значениями, носвойство ItemsSource элемента управления равно нулю, когда я пытаюсь выполнить поиск в списке после того, как пользователь введет какой-либо текст.Есть ли какой-то особый шаг, который я пропустил при создании элемента управления, поэтому используйте шаблон mvvm.

Я надеюсь, что объяснение проблемы понятно.Любая помощь / советы будут приветствоваться.

1 Ответ

1 голос
/ 23 марта 2011

Здесь есть две проблемы:

Во-первых, свойство зависимости определяет, что значение по умолчанию для этого свойства равно нулю.Вы можете изменить это, изменив метаданные, указав новую коллекцию:

public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource",typeof (IList<object>),typeof (AutoCompleteTextBox),
     new PropertyMetadata(new List<object>));

Во-вторых, при использовании свойств зависимостей установщик не может содержать никакой логики.Вы должны оставить свойство равным:

   public IList<object> ItemsSource
    {
        get { return (IList<object>) GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

Это потому, что на самом деле сеттер не вызывается системой привязки - только когда вы используете код.Однако, поскольку класс является DependencyObject, а это DP, вам не нужно вызывать события, измененные свойством.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...