2012-03-09 53 views
0

我試圖通過使用其綁定作爲鍵來查找我想要顯示的值來轉換組合框的顯示值。我似乎無法得到它的工作。Silverlight與值轉換器的組合框綁定

我的用戶控件的datacontext是MyObject。 MyObject有一個屬性「MasterDrawerId」,它是「MyReferencedObject」的Id。

在我的應用程序的其他地方,可以通過我的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; 
    } 
} 

我在我的「Convert」方法的第一行設置一個斷點o我的轉換器,它永遠不會被擊中。

回答

1

而不是

masterSiteComboBox.SelectedItem = binding; 

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

就是這樣。 Thx :) – 2012-03-09 20:47:00

2

組合框所選的項目必須是已包含您通過ItemsSource屬性設置對象的集合中的一個項目。 換句話說,如果您的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,我將會遇到的問題。謝謝。 – 2012-03-09 21:30:37