2012-04-12 19 views
1

私はidとdescriptionを持つアイテムのリストを持っています(必要であれば、代わりにkey-valueコレクションを導入できます)。私が必要とするのは、viewmodel idプロパティにバインドされたコントロールですが、対応するアイテム/ペアの説明が表示されます。私が知っているもっとも近い例は、DisplayMemberPathとSelectedValue/SelectedValuePathを設定するコンボボックスですが、ドロップダウンは必要ありません。 これはSilverlightに組み込まれているコントロールはありますか?Silverlightにこのような組み込みコントロールがありますか?

(もちろん私は1つを自分でコーディングすることができ、それは簡単だし、私もちょうど私が必要とのペアを取得し、それは、単純なテキストブロックへの説明だバインドするためのviewmodelためにいくつかのロジックを置くことができる)

編集:何を説明するために、 funcionality私はシンプルなサンプルクラスをコーディングする必要があります。それは実際に私のニーズを満たすが、私はまだ内蔵コントロールを使用できるかどうかを知りたい。

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つのプロパティがあります。このコントロールをページに配置し、アイテムをバインドし、一方向バインドSelectedIDを配置できます。

編集2:だけでなく、私は動作しませんSelectedIDたDependencyPropertyはそう結合しなかったが、私はすぐにそれを修正します

編集3:最初のスニペットがずさんだったと正常に動作しませんでした私はそれを修正しました。

答えて

1

私が正しく理解していれば、正しいバインディングが実装されている必要があります。

(あなたはそれだけで任意のコントロール似ています1つでもあれば、1つだけのアイテム?リストはいない必要があります)

バインド例えばためのリストItemsControl

はそれが本当に 'あなた' です提供し、あなたの ItemToStringを上書きご list of items

ItemsSourceを設定します。そうでなければ、独自のラッパーを作ることができます。

あなたの商品を紹介しているものをToStringで出力します。説明。

これは最も簡単な解決策です。また、必要に応じてアイテムテンプレートを作成することもできます。

EDIT:
もちょうどビューモデルにすべてをかけると、それに特異的に結合する - 例えばテキストボックスを、すなわち

Text={Binding SelectedText} 


...ビューモデルにSelectedTextSelectedID(必要に応じてItems)を追加 - 正しくdo OnPropertyChangedしてください。

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

+0

当時のリストから、適切なIDを持つアイテムを1つだけ表示する必要があります。 ItemsControlは一度にすべてを表示します。 – noaRAVE

+0

私の編集を参照してください:私は私のニーズをより明確に説明しました。 – noaRAVE

+0

私は自分のコントロールを使っています。 – noaRAVE

関連する問題