带值转换器的Silverlight ComboBox绑定

带值转换器的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

我试图通过使用组合框的绑定作为键来查找我想要显示的值,从而转换组合框的显示值。我似乎无法让它工作

我的用户控件的datacontext是MyObject。 MyObject有一个属性“MasterDrawerId”,它是“MyReferencedObject”的Id

在我的应用程序的其他地方,可以通过my 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”方法的第一行设置了一个断点,它永远不会被击中。

而不是

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,这实际上是一个问题。