我是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模式。
我希望以一种可以理解的方式解释问题。欢迎任何帮助/提示。
答案 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,因此您不需要引发属性更改事件。