C#:可能需要网络呼叫的属性?

时间:2010-12-20 18:54:49

标签: c# silverlight xaml

我知道在C#中,属性应该是快速操作(不是从网络或文件系统中读取数据等)。但是,我正在构建一个Silverlight应用程序,我需要将XAML元素绑定到某些网络数据在ViewModel上。据我所知,绑定只能用于属性,而不能用于方法。我应该在这里打破这个指导方针,还是有另一种解决这个问题的方法呢?

<ListBox ItemsSource="{Binding Users}" />

public IEnumerable<User> Users
{
    get
    {
        // may be cached
        return expensiveNetworkCall();
    }
}

4 个答案:

答案 0 :(得分:3)

实际上,虽然我还没有使用它,但可以绑定到ObjectDataProvider的方法。见这里:http://www.thomasclaudiushuber.com/blog/2008/01/10/bind-to-methods-with-objectdataprovider/

答案 1 :(得分:1)

我会破坏规则并绑定到属性。虽然,正如@Tom所说,你可以绑定到一个方法,但它不会对用户体验有所帮助。您可以使用ObservableCollection(而不是IEnumerable)并在另一个线程上加载用户。甚至可能使用绑定按钮的显式命令来启动昂贵的调用。

答案 2 :(得分:0)

我认为这里的问题是 - 您是否应该让您的用户等待完成绑定?你可以将这个活动产生到另一个方法并返回你得到的东西(开头没什么,下次他们打电话的时候)。

您还可以让用户知道这些值尚未全部可用,并让他们有机会刷新,然后开始显示长时间运行的网络相关流程的结果。

答案 3 :(得分:0)

属性应该仅用于简单的数据/成员访问,并且绝不应该代表冗长的操作,例如网络调用。一种方法更适合这种情况。

将它作为一种方法对于您的UI场景来说今天可能很方便,但会导致出现问题。直接绑定到方法不像属性那样容易支持,因为方法意味着可能不应该绑定到UI的操作。例如,如果底层网络连接挂起,则会导致在UI中直接挂起。这是一种让用户感到沮丧的快捷方式。

这是另一种方法

  • 而不是IEnumerable<Users>使用BindingCollection<Users>
  • BindingCollection<Users>启动为空,并为用户排队网络请求
  • 完成网络请求后,使用找到的数据更新BindingCollection<Users>(确保调用回UI线程)