Добавление свойства IsSelected в EF POCO - PullRequest
1 голос
/ 17 января 2012

У меня есть служба WCF, которая использует EF для передачи данных в мое приложение Silverlight. Мне нужно, чтобы пользователи выбирали несколько элементов из комбинированного списка, связанного с ObservableCollection<SHOP>. Я пытаюсь добавить свойство IsSelected в POCO на стороне Silverlight, чтобы отслеживать, какие элементы выбраны.

Я создал класс с именем SHOPSelect, который наследуется от SHOP, и добавил свойство IsSelected. Затем я изменил список, связанный с моим списком, на этот тип.

Моя проблема заключается в попытке получить данные из WCF как ObservableCollection<SHOP> и преобразовать их в список моего расширенного класса ObservableCollection<SHOPSelect>. Я могу получить код для компиляции с использованием этого, но выдается исключение при попытке привести SHOP к SHOPSelect при отладке.

Main.ShopList = new ObservableCollection<SHOPSelect>(e.Result.Cast<SHOPSelect>());

Исключение составляет:

Невозможно привести объект типа 'SHOP' к типу 'SHOPSelect'.

Каков наилучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Существует несколько методов для решения вашей проблемы. Я предполагаю, что у вас есть какой-то список со значением SelectionMode = "Multiple" или "Extended", и вам нужно отслеживать, что выбрано. Иногда мне приходится делать это с отображением флажков внутри списков.

Прежде всего, для вашей задачи создайте новую наблюдаемую коллекцию таким образом (вам понадобится конструктор в SHOPSelect, который принимает SHOP:

Main.ShopList = new ObservableCollection<SHOPSelect>(
  from shop in e.Result select new SHOPSelect(shop));

Альтернативным методом является использование частичных классов для определения IsSelected.

public partial class SHOP
{
    public bool IsSelected {get; set;}
}

Другой метод заключается в рестайлинге ListBoxItemContainer. Шаблон по умолчанию, используемый Microsoft, находится здесь: http://msdn.microsoft.com/en-us/library/cc278062(v=VS.95).aspx Измените стиль ListBoxItem, заменив

  <ContentPresenter
          x:Name="contentPresenter"
          Content="{TemplateBinding Content}"
          ContentTemplate="{TemplateBinding ContentTemplate}"
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
          Margin="{TemplateBinding Padding}"/>

с

    <CheckBox x:Name="contentControl" 
       IsHitTestVisible="False" VerticalAlignment="Center" 
       HorizontalAlignment="Left" Margin="6,0,0,0" 
       IsChecked="{TemplateBinding IsSelected}">
        <ContentPresenter Margin="6,0,0,0" 
           x:Name="contentPresenter" 
           ContentTemplate="{TemplateBinding ContentTemplate}" 
           Content="{TemplateBinding Content}" 
           VerticalAlignment="Center" 
           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
    </CheckBox>
1 голос
/ 17 января 2012

Вместо того, чтобы наследовать новый тип, просто расширьте существующий тип (частичный класс), добавив свои собственные свойства «только silverlight» - в данном случае «IsSelected».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...