Связывание Silverlight ComboBox с конвертером значений - PullRequest
0 голосов
/ 09 марта 2012

Я пытаюсь преобразовать отображаемое значение комбинированного списка, используя его привязку в качестве ключа для поиска значения, которое я хотел бы отобразить.Кажется, я не могу заставить его работать.

Текст данных моего пользовательского элемента управления - MyObject.MyObject имеет свойство «MasterDrawerId», которое является идентификатором «MyReferencedObject».

В другом месте в моем приложении, доступным через статическое свойство моего App.xaml.cs, является коллекцией «MyOtherObjects».«MyReferencedObject» имеет отношение внешнего ключа с идентификатором «MyOtherObject».

Мой комбинированный список связан с «MasterDrawerId», который передается в конвертер.Затем я использую это в качестве поиска для «MyReferencedObject», чтобы получить идентификатор внешнего ключа «MyOtherObject» для отображения имени этого объекта.

Я знаю, что это кажется странным, но в основном это просто использование свойстватекстовый текст для поиска и отображения имени другого объекта на его месте в выпадающем списке.

Это мой код:

masterSiteComboBox.DisplayMemberPath = "Name";
Binding binding = new Binding("MasterDrawerId");
binding.Mode = BindingMode.TwoWay;
binding.Converter = new DrwIdToSiteConverter();
masterSiteComboBox.SelectedItem = binding;
masterSiteComboBox.ItemsSource = ListOfMyOtherObjects;

Вот мой код преобразователя:

открытый класс 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 ]

2 голосов
/ 09 марта 2012

Выбранный элемент для поля со списком должен быть элементом, который уже содержится в коллекции объектов, заданной с помощью свойства 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 голос
/ 09 марта 2012

Вместо

masterSiteComboBox.SelectedItem = binding;

до

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