简体   繁体   中英

WPF custom control databinding

I'm new to the development of custom controls in WPF, but I tried to develop a single one to use in a application that I'm developing. This control is an autocomplete textbox. In this control, I have a DependencyProprety that has a list of possible entries so a person can choose from while entering the text

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

I use this control in a usercontrol and associate this control to a property in the 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>

I have a viewmodel that I assign on the usercontrol load to the datacontext of the usercontrol load

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

This viewmodel has the property Articles with values but the ItemsSource property of the control is null when I try to search in the list after the user enter some text. Is there any special step that I missed when I create the control so use the mvvm pattern.

I hope that the explain the problem in a understandable way. Any help/hints would be welcome.

There are two issues here:

First, you're dependency property is defining the "default" value for this property to be null. You can change that by changing the metadata to specify a new collection:

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

Secondly, when using dependency properties, the setter can't contain any logic. You should keep your property set as:

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

This is because the setter doesn't actually get called by the binding system - only when you use code. However, since the class is a DependencyObject and this is a DP, you don't need to raise property changed events.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM