我试图通过使用其绑定作为键来转换组合框的显示值,以查找我想要显示的值。我似乎无法让它发挥作用。
我的用户控件的datacontext是MyObject。 MyObject有一个属性“MasterDrawerId”,它是“MyReferencedObject”的ID。
在我的应用程序的其他地方,通过我的App.xaml.cs的静态属性可访问的是“MyOtherObjects”的集合。 “MyReferencedObject”与Id的“MyOtherObject”具有外键关系。
我的组合框绑定到“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;
这是我的转换器代码:
public class DrwIdToSiteConverter:IValueConverter { public 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;
}
}
我在转换器的“转换”方法的第一行设置了一个断点,它永远不会被击中。
答案 0 :(得分: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"};
答案 1 :(得分:1)
而不是
masterSiteComboBox.SelectedItem = binding;
DO
masterSiteComboBox.SetBinding(ComboBox.SelectedItemProperty, binding);