Silverlight ComboBox与值转换器绑定

时间:2012-03-09 16:30:26

标签: silverlight binding converter ivalueconverter

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

我的用户控件的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;
    }
}

我在转换器的“转换”方法的第一行设置了一个断点,它永远不会被击中。

2 个答案:

答案 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);