【问题标题】:Storing the Text Entries of a combo box存储组合框的文本条目
【发布时间】:2012-09-23 21:10:38
【问题描述】:

我有一个文本框,它将保留最后输入的 10 个条目,类似于 Internet Explorer 中的搜索框。用户可以单击下拉菜单查看最后 10 个条目。下拉菜单是一个组合框。我创建了一个绑定到组合框 Itemssource 的 Observable 字符串集合。下面是代码。

Xaml

<Grid x:Name="TextBox_grid" Margin="0,0,40,0" Width="360" Height="23">
    <ComboBox Name="cb" Margin="0,0,-29,0" Style="{DynamicResource Onyx_Combo}" ItemsSource="{Binding TextEntries, ElementName=TheMainWindow, Mode=OneWay}"  IsEditable="False" Visibility="Visible" />
    <Rectangle Fill="#FF131210" Stroke="Black" RadiusX="2" RadiusY="2"/>
    <TextBox Name=UniversalTextBox Margin="0" Background="{x:Null}" BorderBrush="{x:Null}" FontSize="16" Foreground="#FFA0A0A0" TextWrapping="Wrap" PreviewKeyDown="TextBox_PreviewKeyDown"/>
</Grid>

代码

public partial class Window1 : Window
{

    private ObservableCollection<string> m_TextEntries = new ObservableCollection<string>();

    public Window1()
    {
        InitializeComponent();
    }
    public ObservableCollection<string> TextEntries
    {
        get { return m_TextEntries; }
    }
    private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        if (textBox == null)
            return;

        if (e.Key == Key.Enter)
        {
            PopulateHistoryList(textBox.Text);
            e.Handled = true;
        }
        if (e.Key == Key.Escape)
        {
            e.Handled = true;
        }
    }

    private void PopulateHistoryList(string text)
    {
        m_TextEntries.Add(text);
    }

    private event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }

当在文本框上按下 Enter 键时,上面的代码将填充 TextEntries 集合。我需要两件事

  1. 如何设置组合框的 Selected Item 以及如何将其绑定到我的文本框。
  2. 组合框(下拉菜单)应该只显示下拉菜单中的最后 10 个条目。

提前致谢,

【问题讨论】:

    标签: c# wpf xaml wpf-controls


    【解决方案1】:

    使用 Expesssion Blend,将一个控件的属性值绑定到另一个控件的属性值很容易,它被称为 ElementProperty 绑定,这里是您访问在 Blend 中创建它的能力的屏幕截图,请注意,文本框是“对象和时间轴”面板中的选定元素,它是属性面板中文本属性右侧的“小框”,已被单击以生成如图所示的上下文菜单...

    一旦您为文本框的文本属性选择了“元素属性绑定”,您的光标将变成一个小靶心图标,您现在可以通过在任一设计中单击它来指示您要绑定的内容画布或对象和时间线面板,而光标以这种方式出现...... 在这里,我们看到组合框的“SelectedValue”属性被选为文本框中显示内容的来源。完成后,文本框将自动立即设置为显示组合中选择的任何内容。当您执行此操作时,请务必查看 Blend 在您的 XAML 中所做的事情,因为它将帮助您更好地了解实际发生的情况,甚至可能会教您一两件事有关 XAML 的绑定语法。

    至于只有最后十个条目的列表……有几种方法可以做到这一点,每一种都或多或少合适,具体取决于周围的环境,但这是一种方法;只需运行类似于此的过程,只要框添加了条目即可:

    // assuming 'listItems' is your ObservableCollection
    string[] items = listItems.ToArray();
    
    // prepare a new array for the current ten
    string[] tenItems = new string[10];
    
    // copy a subset of length ten, to the temp array, the set your ObservableCollection to this array.
    Array.Copy(items, (items.Length - 10), tenItems, 0, 10);
    

    注意:数组 .Copy 假定将项目添加到可观察集合的唯一方法是通过某种形式的 .Add,它总是将它们添加到列表的末尾...

    【讨论】:

      【解决方案2】:

      部分答案

      <TextBlock Text="{Binding ElementName=cb, Path=SelectedValue}" />
      
      
      <ComboBox x:Name="cb" ItemsSource="{Binding Path=Fields}" SelectedValue="{Binding Path=SelectedValue}"  />
      

      如果你设置了窗口的数据上下文

      DataContext="{Binding RelativeSource={RelativeSource self}}">
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多