Привязка результатов службы RIA и списка к ObserverableCollection в Silverlight4 MVVM - PullRequest
1 голос
/ 26 января 2012

У меня есть результат Entity List<string> GetTagsData, который мне нужно каким-то образом связать с флажками в ObservableCollection, а затем с DataGrid. Эти привязки флажков соответствуют динамической строке с разделителями-запятыми, которая является подмножеством этого результата объекта GetTagsData, за исключением того, что она находится в строке с разделителями-запятыми. Затем пользователь может снять или проверить каждый элемент в DataGrid, а затем мы вызываем обработчик событий, чтобы в основном восстановить строку с разделителем-запятой. Мой вопрос заключается в следующем: есть ли лучший способ создания этого решения? Я вижу это как потенциальную проблему для поддержания в будущем. единственное, что я не могу изменить, - это строка с запятой, входящая и выходящая. и я должен построить его в серебряном свете. Спасибо вперед!

Строка с разделителями-запятыми

'Chicago','New York','Boston','Los Angeles'

Результат сущности для List<string> GetTagsData

GetTagsData = SecurityDomainContext.Current.vwBusinessUnits.Select(d => d.Market).Distinct().ToList();

ObservableCollection Class

    public class TagsCollection : ViewModelBase 
{
    private string _tag;   
    private bool _isSelected; 
    public string Tag
    {
        get
        { return _tag; }
        set 
        { _tag = value; }
    }

    public bool IsSelected
    {
        get 
        { return _isSelected; }
        set 
        { _isSelected = value; }
    }  

Теперь в моей ViewModel я могу перебирать результаты Entity в Collection и связывать эту Collection с DataGrid.

private ObservableCollection<TagsCollection> GetTagsCollection(string colName)
        {
            ObservableCollection<TagsCollection> ocTags = new ObservableCollection<TagsCollection>();

                            foreach (string tag in GetTagsData)
                        {
                            if (DelimitedTagSet.Contains(tag.Trim()))
                            {
                                ocTags.Add(new TagsCollection { Tag = tag, IsSelected = true });
                            }
                            else
                            {
                                ocTags.Add(new TagsCollection { Tag = tag, IsSelected = false });
                            }                               
                        }
            return ocTags;
        }

Вот как выглядит вид xaml enter image description here

1 Ответ

1 голос
/ 26 января 2012

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

Если список представляет собой статический список, который вы ожидаете, например, состояния, я бы, конечно, предложил вам иметь список состояний и сопоставлять его.

Создайте класс Tag, который реализует INotifyPropertyChanged, который имеет два реквизита (имя выбрано) и не забудьте поднять PropertyChanged для каждого изменения свойства (я вижу, это исключено из вашего кода, я полагаю, для краткости).

Создайте подкласс List, добавьте строковый конструктор и переопределите ToString (), выполните весь анализ в этом классе и верните результат в ToString, а затем вызовите его из вашей ViewModel.

Теперь я понимаю, что вы пометили вопрос с помощью RIA, так почему вы хотите связать эту строку с запятой?

Возможно, вы захотите выставить опции на сервере и рассматривать их так, чтобы клиент не знал, что это разделитель запятой.

public class OptionsViewModel : ViewModelBase
{

  public OptionsViewModel()
  {
     IsBusy = True;
     var context = new MyDomainContext();
     _Tags = context.Tags;
     //if called elsewhere but from ctor, make sure context.IsLoading is false;
     //The Load method is throwing an exception if re-loading when a load is on.
     //Debug.Assert(!context.IsLoading);
     context.Load(
        context.GetTagsQuery(),
        (op) =>
        {
          if(op.HasError && !op.IsErrorHandled) op.MarkErrorAsHandlere();
          IsBusy = false;
        },
        null);
  }

  private readonly Ienumerable<Tag> _Tags;
  public Ienumerable<Tag> Tags
  {
    get
    {
      return _Tags;
    }
  }

}

На сервере выставьте операцию, которая возвращает этот datacontract (из Tag) и сервер должен выполнить разбор запятой.

...