我知道在C#中,属性应该是快速操作(不是从网络或文件系统中读取数据等)。但是,我正在构建一个Silverlight应用程序,我需要将XAML元素绑定到某些网络数据在ViewModel上。据我所知,绑定只能用于属性,而不能用于方法。我应该在这里打破这个指导方针,还是有另一种解决这个问题的方法呢?
<ListBox ItemsSource="{Binding Users}" />
public IEnumerable<User> Users
{
get
{
// may be cached
return expensiveNetworkCall();
}
}
答案 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线程)