2012-03-09 4 views
0

コンボボックスの表示値を、そのバインディングをキーとして使用して表示したい値を検索しようとしています。私はそれを働かせるように見えない。Silverlightコンボボックスバインディングと値コンバーター

私のユーザーコントロールのdatacontextはMyObjectです。 MyObjectには、 "MyReferencedObject"のIDである "MasterDrawerId"というプロパティがあります。

私のApp.xaml.csの静的プロパティからアクセスできるアプリケーションのどこにも、 "MyOtherObjects"のコレクションがあります。 "MyReferencedObject"は "MyOtherObject"のIdとの外部キー関係を持ちます。

私のコンボボックスは「MasterDrawerId」にバインドされています。これがコンバーターに渡されます。 それを "MyReferencedObject"のルックアップとして使用して、そのオブジェクトの名前を表示するために "MyOtherObject"の外部キーIdを取得します。

私はそれが混乱しているように見えますが、基本的にdatacontextのプロパティを使ってルックアップを行い、別のオブジェクトの名前をコンボボックス内の場所に表示しています。

これは私のコードである:ここ

masterSiteComboBox.DisplayMemberPath = "Name"; 
Binding binding = new Binding("MasterDrawerId"); 
binding.Mode = BindingMode.TwoWay; 
binding.Converter = new DrwIdToSiteConverter(); 
masterSiteComboBox.SelectedItem = binding; 
masterSiteComboBox.ItemsSource = ListOfMyOtherObjects; 

は私の変換コードである:

パブリッククラスDrwIdToSiteConverter:IValueConverter { パブリックDrwIdToSiteConverter() { }

public virtual object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     XferSite site = new XferSite(); 

     foreach(XferUserDrawerPermissions perm in App.UserDrawerPermissions) 
     { 
      if (perm.DocumentTypeId.Match(value.ToString())) 
      { 
       site.Id = int.Parse(perm.SiteId); 
       site.Name = perm.SiteName; 
       break; 
      } 
     } 

     return site; 
    } 

    public virtual object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value; 
    } 
} 

I私の "Convert"メソッドの最初の行にブレークポイントを設定する私のコンバータとそれは決してヒットしません。代わりに

masterSiteComboBox.SelectedItem = binding; 

答えて

1

は、すでにあなたがItemsSourceプロパティを介して設定オブジェクトのコレクションに含まれる項目でなければなりません

masterSiteComboBox.SetBinding(ComboBox.SelectedItemProperty, binding); 
+0

。 Thx :) –

2

コンボボックスの選択した項目を実行します。 つまり、ItemsSourceがObject1、Object2、Object3のコレクションにバインドされている場合、SelectedItemをnew Object() { Name = 1 };に設定することはできません。これを行うには、EqualsメソッドとGetHashCodeメソッドをオーバーライドする必要があります。これにより、SelectedItemを新しいオブジェクトに設定することができます。

例:それだった

public class MyObject 
{ 
    public MyObject(string name) 
    { 
     if(string.IsNullOrEmpty(name)) throw new ArgumentNullException("name"); 
     Name = name; 
    } 

    public string Name { get; private set; } 

    // override object.Equals 
    public override bool Equals(object obj) 
    { 
     //  
     // See the full list of guidelines at 
     // http://go.microsoft.com/fwlink/?LinkID=85237 
     // and also the guidance for operator== at 
     // http://go.microsoft.com/fwlink/?LinkId=85238 
     // 

     MyObject myObj = obj as MyObject; 
     if (myObj == null) return false; 

     return Name == myObj.Name; 
    } 

    // override object.GetHashCode 
    public override int GetHashCode() 
    { 
     return Name.GetHashCode; 
    } 
} 

var items = new List<MyObject>() 
      { 
       new MyObject {Name = "One"}, 
       new MyObject {Name = "Two"}, 
       new MyObject {Name = "Three"}, 
      }; 

// Converter code 
return new MyObject {Name = "One"}; 
+0

新しいXferSiteを作成するのではなく、実際のオブジェクト自体を返すコンバーターのコードを修正していないと、これは実際に問題になりました。どうも。 –

関連する問題