0

Internet Explorerの検索ボックスと同様に、最後に入力した10個のエントリを保持するテキストボックスがあります。ユーザーはドロップダウンメニューをクリックして、最後の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コレクションに入力されます。私は2つのものが必要です

  1. コンボボックスの選択項目を設定するにはどうすればよいですか。また、それをテキストボックスにバインドするにはどうすればよいですか。
  2. コンボボックス(ドロップメニュー)には、ドロップダウンメニューの最後の10エントリのみが表示されます。

前もって感謝します、

4

2 に答える 2

0

Exesssion Blend を使用すると、あるコントロールのプロパティの値を別のコントロールのプロパティ値に簡単にバインドできます。これは ElementProperty Binding として知られています。これは、Blend 内でこれを作成する機能にアクセスするスクリーンショットです。 Textbox は Objects and Timeline パネルで選択された要素であり、プロパティ パネルの Text プロパティの右側にある「小さなボックス」であり、クリックされてコンテキスト メニューが表示されます... ここに画像の説明を入力

テキスト ボックスのテキスト プロパティに [Element Property Binding] を選択すると、カーソルが小さなブルズアイ アイコンになり、デザイン キャンバスまたは[オブジェクトとタイムライン] パネル、カーソルがそのように表示されている間... ここに画像の説明を入力 ここでは、テキスト ボックスに表示されるもののソースとして選択されているコンボ ボックスの 'SelectedValue' プロパティを確認します。完了すると、テキストボックスはすぐに自動的に設定され、コンボで選択されたものを表示します。これを行うときは、Blend が XAML で何を行っているかを必ず確認してください。実際に何が起こっているのかをよりよく理解するのに役立ち、XAML のバインド構文についても 1 つまたは 2 つ教えてくれるかもしれません。

最後の 10 個のエントリしかないリストについては...これを行うにはいくつかの方法があり、周囲のコンテキストに応じてそれぞれ多かれ少なかれ適切ですが、ここに 1 つの方法があります。ボックスにエントリが追加されるたびに、次のような手順を実行するだけです。

// 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);

注: Array .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 に答える