我有一个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视图的样子
答案 0 :(得分:1)
根据我的理解,您必须提供的状态是一个动态不可变的选项列表,您希望提示用户启用/禁用每个选项,然后将结果作为原始字符串返回。
如果列表是您期望的静态列表,例如状态,我肯定会建议你有一个状态列表,并映射它。
创建一个实现INotifyPropertyChanged的Tag类,它有两个道具(名称,已选中)并记得为每个属性更改引发PropertyChanged
(我看到它被排除在您的代码之外,我假设为了简洁起见)。
创建一个List子类,添加一个字符串构造函数并覆盖ToString(),在此类中进行所有解析并在ToString上返回结果,然后从ViewModel中调用它。
我现在意识到您使用标记了问题,那么为什么要绑定该逗号分隔的字符串?
您可能希望公开服务器中的选项并将其视为这样,因此客户端不知道它是以逗号分隔的。
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)的操作,服务器应该进行逗号字符串解析。