带值转换器的Silverlight ComboBox绑定
我试图通过使用组合框的绑定作为键来查找我想要显示的值,从而转换组合框的显示值。我似乎无法让它工作 我的用户控件的datacontext是MyObject。 MyObject有一个属性“MasterDrawerId”,它是“MyReferencedObject”的Id 在我的应用程序的其他地方,可以通过my App.xaml.cs的静态属性访问“MyOtherObjects”的集合。“MyReferencedObject”与“MyOtherObject”的Id具有外键关系 我的组合框绑定到“MasterDrawerId”,这是传递到转换器的内容。 然后,我将其用作“MyReferencedObject”的查找,以获取“MyOtherObject”的外键Id,从而显示该对象的名称 我知道这看起来很混乱,但它基本上只是使用datacontext的属性来进行查找,并在组合框中显示另一个对象的名称 这是我的代码:带值转换器的Silverlight ComboBox绑定,silverlight,binding,converter,ivalueconverter,Silverlight,Binding,Converter,Ivalueconverter,我试图通过使用组合框的绑定作为键来查找我想要显示的值,从而转换组合框的显示值。我似乎无法让它工作 我的用户控件的datacontext是MyObject。 MyObject有一个属性“MasterDrawerId”,它是“MyReferencedObject”的Id 在我的应用程序的其他地方,可以通过my App.xaml.cs的静态属性访问“MyOtherObjects”的集合。“MyReferencedObject”与“MyOtherObject”的Id具有外键关系 我的组合框绑定到“Mas
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”方法的第一行设置了一个断点,它永远不会被击中。而不是
masterSiteComboBox.SelectedItem = binding;
做
而不是
masterSiteComboBox.SelectedItem = binding;
做
组合框的选定项必须是已包含在通过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"};
公共类MyObject
{
公共MyObject(字符串名称)
{
if(string.IsNullOrEmpty(name))抛出新的ArgumentNullException(“name”);
名称=名称;
}
公共字符串名称{get;private set;}
//覆盖对象。等于
公共覆盖布尔等于(对象对象对象)
{
//
//有关指南的完整列表,请参见
// http://go.microsoft.com/fwlink/?LinkID=85237
//以及操作员==at的指南
// http://go.microsoft.com/fwlink/?LinkId=85238
//
MyObject myObj=作为MyObject的obj;
if(myObj==null)返回false;
返回名称==myObj.Name;
}
//重写object.GetHashCode
公共覆盖int GetHashCode()
{
返回Name.GetHashCode;
}
}
var items=新列表()
{
新的MyObject{Name=“One”},
新的MyObject{Name=“Two”},
新的MyObject{Name=“Three”},
};
//转换器代码
返回新的MyObject{Name=“One”};
组合框的选定项必须是已包含在通过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"};
公共类MyObject
{
公共MyObject(字符串名称)
{
if(string.IsNullOrEmpty(name))抛出新的ArgumentNullException(“name”);
名称=名称;
}
公共字符串名称{get;private set;}
//覆盖对象。等于
公共覆盖布尔等于(对象对象对象)
{
//
//有关指南的完整列表,请参见
// http://go.microsoft.com/fwlink/?LinkID=85237
//以及操作员==at的指南
// http://go.microsoft.com/fwlink/?LinkId=85238
//
MyObject myObj=作为MyObject的obj;
if(myObj==null)返回false;
返回名称==myObj.Name;
}
//重写object.GetHashCode
公共覆盖int GetHashCode()
{
返回Name.GetHashCode;
}
}
var items=新列表()
{
新的MyObject{Name=“One”},
新的MyObject{Name=“Two”},
新的MyObject{Name=“Three”},
};
//转换器代码
返回新的MyObject{Name=“One”};
如果我没有修改转换器的代码以返回实际对象本身,而不是创建新的XferSite.Thx,这实际上是一个问题。如果我没有修改转换器的代码以返回实际对象本身,而不是创建新的XferSite.Thx,这实际上是一个问题。