将RIA服务结果和列表绑定到Silverlight4 MVVM中的ObserverableCollection

时间:2012-01-25 23:11:31

标签: c# wcf silverlight xaml ria

我有一个List<string> GetTagsData的实体结果,我需要以某种方式与ObservableCollection中的复选框绑定,然后绑定到DataGrid。这些复选框绑定对应于动态逗号分隔的字符串,该字符串是该实体结果GetTagsData的子集,除了它在逗号分隔的字符串中。然后,用户可以取消选中或检查DataGrid中的每个项目,然后我们调用事件处理程序来基本上重新生成逗号分隔的字符串。我的问题是,有没有更好的方法来构建这个解决方案?我认为这是未来维持的潜在问题。我唯一不能改变的是逗号分隔的字符串进出。我必须用Silverlight来构建它。谢谢你!

逗号分隔字符串

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

List<string> GetTagsData

的实体结果
GetTagsData = SecurityDomainContext.Current.vwBusinessUnits.Select(d => d.Market).Distinct().ToList();

ObservableCollection类

    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 个答案:

答案 0 :(得分:1)

根据我的理解,您必须提供的状态是一个动态不可变的选项列表,您希望提示用户启用/禁用每个选项,然后将结果作为原始字符串返回。

如果列表是您期望的静态列表,例如状态,我肯定会建议你有一个状态列表,并映射它。

创建一个实现INotifyPropertyChanged的Tag类,它有两个道具(名称,已选中)并记得为每个属性更改引发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)的操作,服务器应该进行逗号字符串解析。