0

我有一个文本框,它将保留最后输入的 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 个条目。

提前致谢,

4

2 回答 2

0

使用 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,它总是将它们添加到列表的末尾......

于 2012-09-23T22:26:07.603 回答
0

部分答案

<TextBlock Text="{Binding ElementName=cb, Path=SelectedValue}" />


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

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

DataContext="{Binding RelativeSource={RelativeSource self}}">
于 2012-09-23T22:50:18.377 回答