WPF自定义控件数据绑定

时间:2011-03-23 17:23:58

标签: wpf data-binding mvvm custom-controls

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

我在usercontrol中使用此控件,并将此控件与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>

我有一个viewocodel,我将usercontrol加载分配给usercontrol load的datacontext

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

当我尝试在用户输入一些文本后在列表中搜索时,此视图模型的属性Articles具有值,但控件的ItemsSource属性为null。 我创建控件时是否有任何特殊步骤,因此请使用mvvm模式。

我希望以一种可以理解的方式解释问题。欢迎任何帮助/提示。

1 个答案:

答案 0 :(得分:1)

这里有两个问题:

首先,您的依赖项属性将此属性的“默认”值定义为null。您可以通过更改元数据来指定新集合来更改它:

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

其次,在使用依赖项属性时,setter不能包含任何逻辑。您应将您的属性设置为:

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

这是因为只有在使用代码时,绑定系统才会实际调用setter。但是,由于该类是DependencyObject而且这是一个DP,因此您不需要引发属性更改事件。