繁体   English   中英

当使用MVVM + WP7 + LongListSelector选中对号时,如何调用服务器

[英]How to Call Server when Checkmark is hit using MVVM + WP7 + LongListSelector

我在Windows Phone上使用LongListSelector,遇到了问题。 我在此列表中的每一行都有一个复选框。

如果用户选中了我要发送到服务器的复选框,则该复选框已选中。 如果用户再次取消选中该复选框,则该复选框将发送到服务器并存储为未选中状态。

当用户再次加载视图时,将从服务器重新填充所有行,并选中相应的复选框。

我不确定如何执行此操作。 我正在使用MVVM模式,所以我在模型中具有IsChecked属性(列表中每一行的模型都具有一个)。

起初,我以为我可以在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 bool IsCheckedSetting
{
    set
    {
        if (value == isChecked)
            return;
        isChecked = value;
        RaisePropertyChanged(() => IsChecked);
    }
}

上面的方法是可以的,但是如果您有很多设置,那么为每个设置创建2个属性是一种拖累。 在这种情况下,另一种方法是围绕服务代理创建包装器类。 该包装器应跟踪每个属性的值,并且仅在值实际上已更新时才调用远程服务。 仅用于说明:

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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM