C# 如何使用MVVM+;WP7&x2B;长列表选择器

C# 如何使用MVVM+;WP7&x2B;长列表选择器,c#,windows-phone-7,mvvm,checkbox,C#,Windows Phone 7,Mvvm,Checkbox,我正在使用Windows Phone的LongListSelector,遇到问题。在这个列表中,每一行都有一个复选框 如果用户选中了我要发送到服务器的复选框,则选中了该复选框。如果用户再次取消选中该复选框,则会将其发送到服务器并存储为未选中状态 当用户再次加载视图时,将从服务器重新填充所有行,并选中相应的复选框 但我不知道该怎么做。我使用的是MVVM模式,所以我在模型中检查了属性(列表中的每一行对应一个模型) 起初,我认为可以在IsChecked属性中调用服务器,但如果我这样做,那么每次初始加载

我正在使用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();
}
}