【问题标题】:UpdateSourceTrigger usage C# WPFUpdateSourceTrigger 使用 C# WPF
【发布时间】:2016-02-04 09:11:03
【问题描述】:

我目前在我的项目中使用这个AutoCompleteTextBoxWPFTextBoxAutoComplete

我将 TextBox 绑定到 List<string> 的员工姓名。我就是这样做的;

<TextBox 
    Width="250"  Height="50" HorizontalAlignment="Center"
    Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" 
    behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding Employees}" 
/>

我希望TextBox 做的是在用户输入员工姓名时提供建议。但是,根本没有出现任何建议,这让我相信我没有正确绑定UpdateSourceTrigger

如果我只是将行为绑定到List&lt;string&gt;,那么当没有员工姓名的属性时,Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" 如何工作?我有点不确定需要更改什么来触发更新源。

该网站提供了这样的解释:现在,每次更改数据上下文的“TestText”属性时,WPFTextBoxAutoComplete 都会为您提供自动完成建议。

但是,我不相信我的 DataContext 具有“名称”属性。

编辑

/**** AutoComplete ****/
public static readonly DependencyProperty AutoCompleteTest = DependencyProperty.Register(
"Test", typeof(string), typeof(CompanyManagement), new PropertyMetadata(default(string)));

public string Test
{
    get { return (string)GetValue(AutoCompleteTest); }
    set { SetValue(AutoCompleteTest, value); }
}

文本框 XAML

        <TextBox 
            Width="250"  Height="50" HorizontalAlignment="Center"
            Text="{Binding Test, UpdateSourceTrigger=PropertyChanged}" 
            behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding Employees}" 
        />

【问题讨论】:

  • 您可以调试绑定并查看文本到底发生了什么。您可以通过将Text="{Binding Name, diagnostics:PresentationTraceSources.TraceLevel=High, UpdateSourceTrigger=PropertyChanged} 添加到文本并将xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" 添加到窗口定义来实现。

标签: c# wpf autocomplete updatesourcetrigger


【解决方案1】:

您只需要在您的DataContext 中添加一个名为Name 的属性,并带有更改通知(使用DependencyPropertyINotifyPropertyChanged)。

  1. DependencyProperty:

    public static readonly DependencyProperty NameProperty = DependencyProperty.Register(
        "Name", typeof (string), typeof (WhateverClassYouHave), new PropertyMetadata(default(string)));
    
    public string Name
    {
        get { return (string) GetValue(NameProperty); }
        set { SetValue(NameProperty, value); }
    }
    
  2. INotifyPropertyChanged:

    public class WhateverClassYouHave: INotifyPropertyChanged
    
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged(nameof(Name)); // C# 6 feature
        }
    }
    
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); // C# 6 feature
    }
    

当您键入时,Name 属性将发生变化,通知有关更改的行为,它会为您提供建议。

结果:

【讨论】:

  • 感谢您的回答!我该如何更改它,以便它根据员工姓名的List&lt;string&gt; 填写?
  • 在您的DataContext 中只有一个名为Employees 的属性。我是这样分配的:Employees = new List&lt;string&gt; { "John Doe", "Jane Doe", "Lara Croft", "Sam Fisher", "Szabolcs Dézsi" };
  • 再次感谢。但是,我现在收到一个错误:'对与指定绑定约束匹配的'View.Companies.Test'类型的构造函数的调用引发了异常。'行号“8”和行位置“7”。
  • 我也收到了可能相关的警告:隐藏继承的成员“FrameworkElement.NameProperty”。如果打算隐藏,请使用新关键字。
  • 我假设你在一个 UserControl 中,它继承自 FrameworkElement,而 FrameworkElement 已经有一个 Name 属性。我现在得走了,但是当我再次靠近电脑时,我会尽力提供帮助。
猜你喜欢
  • 1970-01-01
  • 2015-01-06
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多