C# 如何使用MVVM+;WP7&x2B;长列表选择器
我正在使用Windows Phone的LongListSelector,遇到问题。在这个列表中,每一行都有一个复选框 如果用户选中了我要发送到服务器的复选框,则选中了该复选框。如果用户再次取消选中该复选框,则会将其发送到服务器并存储为未选中状态 当用户再次加载视图时,将从服务器重新填充所有行,并选中相应的复选框 但我不知道该怎么做。我使用的是MVVM模式,所以我在模型中检查了属性(列表中的每一行对应一个模型) 起初,我认为可以在IsChecked属性中调用服务器,但如果我这样做,那么每次初始加载发生时,都会调用服务器C# 如何使用MVVM+;WP7&x2B;长列表选择器,c#,windows-phone-7,mvvm,checkbox,C#,Windows Phone 7,Mvvm,Checkbox,我正在使用Windows Phone的LongListSelector,遇到问题。在这个列表中,每一行都有一个复选框 如果用户选中了我要发送到服务器的复选框,则选中了该复选框。如果用户再次取消选中该复选框,则会将其发送到服务器并存储为未选中状态 当用户再次加载视图时,将从服务器重新填充所有行,并选中相应的复选框 但我不知道该怎么做。我使用的是MVVM模式,所以我在模型中检查了属性(列表中的每一行对应一个模型) 起初,我认为可以在IsChecked属性中调用服务器,但如果我这样做,那么每次初始加载
/// <summary>
/// The <see cref="IsChecked" /> property's name.
/// </summary>
public const string IsCheckedPropertyName = "IsChecked";
private bool isChecked = false;
/// <summary>
/// Sets and gets the IsChecked property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public bool IsChecked
{
get
{
return isChecked;
}
set
{
if (isChecked == value)
{
return;
}
// if I do this here then it will solve my problem when a user checks a box but when I do initial load I will face the problem
// that it will call my server for every row for no reason at all.
CallWebService(value);
RaisePropertyChanging(() => IsChecked);
isChecked = value;
RaisePropertyChanged(() => IsChecked);
}
}
//
///该属性的名称。
///
public const string IsCheckedPropertyName=“IsChecked”;
private bool isChecked=假;
///
///设置并获取IsChecked属性。
///更改该属性的值将引发PropertyChanged事件。
///
公共场所被检查
{
得到
{
返回检查;
}
设置
{
if(isChecked==值)
{
返回;
}
//如果我在这里这样做,那么当用户选中一个框时,它将解决我的问题,但是当我进行初始加载时,我将面临这个问题
//它会无缘无故地为每一行调用我的服务器。
CallWebService(值);
RAISE属性更改(()=>已检查);
isChecked=值;
RaisePropertyChanged(()=>已检查);
}
}
有什么建议吗?您可以为设置添加单独的方法/设置器。这将由负责从服务器设置初始值的代码专门使用
public bool IsCheckedSetting
{
set
{
if (value == isChecked)
return;
isChecked = value;
RaisePropertyChanged(() => IsChecked);
}
}
上面的方法是可以的,但是如果你有很多设置,那么为每个设置创建两个属性是一种阻力。在这种情况下,另一种方法是围绕服务代理创建包装器类。此包装器应跟踪每个属性的值,并且仅在值实际已更新时调用远程服务。仅作说明:
public class SettingsWrapper
{
Dictionary<string, object> settings = new Dictionary<string, object>();
// TODO populate with initial values from server
public bool UpdateSetting<T>(string name, T value)
{
// only update if the initial value is ready, and if the new value is different
if (settings.ContainsKey(name) && (T)settings[name] != value)
CallWebService();
}
}
公共类设置rapper
{
字典设置=新建字典();
//TODO使用服务器中的初始值填充
公共布尔更新设置(字符串名称,T值)
{
//仅在初始值已准备就绪且新值不同时更新
if(settings.ContainsKey(name)&(T)settings[name]!=value)
CallWebService();
}
}