C #: свойства, которые могут потребовать сетевой вызов? - PullRequest
2 голосов
/ 20 декабря 2010

Я знаю, что в C # свойства должны быть быстрыми операциями (не считывать данные из сети или файловой системы и т. Д.). Однако я создаю приложение Silverlight, и мне нужно привязать элемент XAML к некоторым сетевым данным.на ViewModel.Насколько я знаю, привязка может быть выполнена только к свойствам, а не к методам.Должен ли я нарушить руководящие принципы здесь, или есть другой способ обойти это, что не происходит со мной?

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

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

Ответы [ 4 ]

3 голосов
/ 20 декабря 2010

На самом деле, хотя я еще не использовал его, вы можете связываться с методами с ObjectDataProvider.Смотрите здесь: http://www.thomasclaudiushuber.com/blog/2008/01/10/bind-to-methods-with-objectdataprovider/

1 голос
/ 20 декабря 2010

Я бы нарушил правило и привязал к собственности. Хотя, как утверждает @Tom, вы можете привязать метод, но это не повлияет на работу пользователя. Вы можете использовать ObservableCollection (вместо IEnumerable) и загружать пользователей в другой поток. Возможно даже с явной командой, связанной с кнопкой, чтобы инициировать дорогой вызов.

0 голосов
/ 20 декабря 2010

Свойства должны использоваться только для простого доступа к данным / элементам и никогда не должны представлять длительную операцию, такую ​​как сетевой вызов. Метод гораздо более подходит для этого сценария.

Использование его в качестве метода может быть удобным сегодня для сценария вашего пользовательского интерфейса, но приведет к проблемам в будущем. Привязка непосредственно к методу не поддерживается так же просто, как свойства, потому что метод подразумевает операцию, которая, вероятно, не должна быть связана с пользовательским интерфейсом. Например, если основное сетевое соединение зависает, это приведет к прямому зависанию интерфейса пользователя. Это быстрый способ расстроить пользователей.

Вот альтернативный подход

  • Вместо IEnumerable<Users> используйте BindingCollection<Users>
  • Пусть BindingCollection<Users> запускается как пустой и ставит в очередь сетевой запрос для пользователей
  • Когда сетевой запрос завершен, обновите BindingCollection<Users> найденными данными (убедитесь, что Invoke вернулись в поток пользовательского интерфейса)
0 голосов
/ 20 декабря 2010

Я думаю, что проблема заключается в том, должны ли ваши пользователи ждать завершения связывания?Вы можете вызвать это действие к другому методу и вернуть то, что у вас есть (ничего в начале, что-то в следующий раз, когда они вызовут).

Вы также можете сообщить пользователям, что значения еще не все доступны, и датьу них есть возможность обновить, а затем начать показывать результаты длительного процесса, связанного с сетью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...