在我的OpenViewModel中我收集数据:
private ObservableCollection<KeyValue> availableData;
public ObservableCollection<KeyValue> AvailableDatas
{
get { return availableData; }
set
{
if (value != availableData)
{
availableData= value;
NotifyOfPropertyChange("AvailableDatas");
}
}
}
收集数据的方法:
public ObservableCollection<KeyValue> CollectData()
{
ConnectorClient client = null;
try
{
client = webservice.GetClient();
AvailableDatas = client.GetDatas();
client.Close();
}
catch (Exception ex)
{
webservice.HandleException(ex, client);
}
return AvailableDatas;
}
如何在wpf中调用CollectData方法并填充我的COmboBox?
THX
答案 0 :(得分:0)
您可能只是在第一次访问AvailableDatas
属性时调用该方法(例如,来自XAML中的绑定):
private ObservableCollection<KeyValue> availableData;
public ObservableCollection<KeyValue> AvailableDatas
{
get
{
if (availableData == null)
{
availableData = CollectData();
}
return availableData;
}
set
{
if (value != availableData)
{
availableData = value;
NotifyOfPropertyChange("AvailableDatas");
}
}
}
然后你应该以一种不设置属性的方式更改CollectData方法:
public ObservableCollection<KeyValue> CollectData()
{
ConnectorClient client = null;
ObservableCollection<KeyValue> data = null;
try
{
client = webservice.GetClient();
data = client.GetDatas();
client.Close();
}
catch (Exception ex)
{
webservice.HandleException(ex, client);
}
return data;
}
答案 1 :(得分:0)
您可以覆盖OnActivated()
事件,假设您正在使用IScreen
实现并在其中加载数据,或者只是在构造函数或自定义Initialise
方法中执行此操作(如果您愿意)滚动你自己(或在某人已经说过的属性访问者)。
如果你想为用户提供一些视觉上下文并且更好地配合CM动作,你也可以使用协同程序
这里有一个很好的简单实现Loader
类,它有助于为用户提供可视化上下文:
这会在可见树中搜索BusyIndicator
控件,并在内容加载时激活它。 ...
public class SomeViewModel : Screen
{
protected override void OnActivate()
{
RefreshData();
}
public void RefreshData()
{
Coroutine.BeginExecute(LoadData(), new ActionExecutionContext() { Target = this });
}
public IEnumerable<IResult> LoadData()
{
yield return Loader.Show("Loading Data...");
yield return new LoadSomeDataRoutine(client.GetDatas);
yield return Loader.Hide();
}
}
拥有RefreshData
方法的原因是,这也允许您绑定CM操作,并允许协程可以获取更多上下文信息。
显然,您不必担心Silverlight中的async-&gt;同步优势,因为您使用的是WPF(但它仍然适用于异步Web服务调用),但它仍然有许多好处,它也可以帮助您编写可重用的例程,这些例程成为应用程序框架的一部分(例如,IResult
实现中封装的某种级别的错误处理/日志记录等)
您还提到填充组合框...您在CM中需要做的就是在控件上放置一个组合框,并将其Name
属性设置为VM上属性的名称:
public class SomeViewModel : Screen
{
public ObservableCollection<MyObject> MyProperty { //blah blah... }
}
<UserControl .... blah>
<ComboBox x:Name="MyProperty" />
</UserControl>
这将为组合框填充项目。您仍需要为SelectedItem
/ SelectedValue
我猜你已经知道了 - 如果不是CM有一些不错的文档: