1

IDと説明を含むアイテムのリストがあります(必要に応じて、代わりにキーと値のコレクションを導入できます)。必要なのは、viewmodel id プロパティにバインドされたコントロールですが、対応するアイテム/ペアの説明を表示します。私が知っている最も近い例は、DisplayMemberPath と SelectedValue/SelectedValuePath を設定するコンボボックスですが、ドロップダウンは必要ありません。では、Silverlight にはこのためのビルトイン コントロールはありますか?

(もちろん、私は自分でコードを書くことができます。簡単で、必要なペアを取得し、その説明を単純なテキストブロックにバインドするためのビューモデルのロジックを配置することもできます)

編集:必要な機能を説明するために、簡単なサンプルクラスをコーディングしました。それは実際に私のニーズを満たしていますが、組み込みのコントロールを使用できるかどうかを知りたいです。

public class CollectionItemDisplayControl:TextBox
{
    public CollectionItemDisplayControl()
    {
        IsReadOnly = true;

    }

    public string SelectedID
    {
        get { return (string)GetValue(SelectedIDProperty); }
        set { SetValue(SelectedIDProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SelectedID.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedIDProperty =
        DependencyProperty.Register("SelectedID", typeof(string), typeof(CollectionItemDisplayControl), new PropertyMetadata(new PropertyChangedCallback(OnSelectedIDChangedStatic)));


    private static void OnSelectedIDChangedStatic(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        CollectionItemDisplayControl originator = d as CollectionItemDisplayControl;
        if (originator != null)
        {
            originator.OnSelectedIDChanged(e);
        }
    }

    private void OnSelectedIDChanged(DependencyPropertyChangedEventArgs e)
    {
        string description = String.Empty;
        string value = e.NewValue as string;
        if (value != null)
        {
            foreach (var item in _items)
            {
                if (item.UniqueID == value)
                {
                    description = item.Description;
                    break;
                }
            }
        }
        Text = description;
    }        

    private IDataCollection _viewModel;
    public IDataCollection ViewModel
    {
        get { return _viewModel; }
        set
        {
            _viewModel = value;
            if (_viewModel != null)
            {
                _items = _viewModel.Items;
            }
        }
    }

    private ObservableCollection<IUnique> _items = new ObservableCollection<IUnique>();

}

ItemClass には、ID と説明の 2 つのプロパティが含まれています。このコントロールをページに配置し、Items をバインドし、SelectedID を一方向にバインドできます。

編集 2: SelectedID DependencyProperty を作成しなかったため、バインディングは機能しませんが、すぐに修正します

編集 3:最初のスニペットがずさんで、適切に動作しなかったので、修正しました。

4

1 に答える 1

1

ちゃんと理解していれば、

適切なバインディングを実装する必要があるだけです。

(リストが必要ですか?単一のアイテムだけでなく、単一のコントロールでも同様です)

リストをegにバインドしますItemsControl

ItemsSourceあなたに設定list of items

次に、それが本当に「あなたのもの」であることを提供してオーバーライドToStringします。Itemそうでない場合は、独自のラッパーを作成できます。

ToString 内では、説明など、アイテムを提示しているものはすべて出力されます。

それが一番手っ取り早い方法です。必要に応じてアイテム テンプレートを作成することもできます。

編集:
ビューモデルにすべてを入れてそれにバインドするだけです-TextBox、つまり

Text={Binding SelectedText}

例...ビューモデルにand (および必要に応じて)を
追加します-適切に実行します。 SelectedTextSelectedIDItemsOnPropertyChanged

ビュー モデルから SelectedID を設定するか、それを変更する可能性のある別のコントロールから「バインド」されている場合。
SelectedID のセット内で SelectedText を設定します。
そのようなもののためのコントロールは必要ありません。実際にはすべてデータ バインディングです。

于 2012-04-13T00:10:14.550 に答える