0

在我的 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 并填充我的组合框?

谢谢

4

2 回答 2

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;
}
于 2013-01-23T09:50:29.387 回答
0

OnActivated()假设您正在使用实现并在其中加载数据,您可以覆盖该事件,或者如果您想自己滚动(或在属性访问器中,如某人已经说过的)IScreen,则只需在构造函数或自定义方法中执行它。Initialise

如果您想为用户提供一些视觉上下文并更好地与 CM 操作结合,您也可以使用协程

这里有一个Loader类的一个很好的简单实现,它有助于为用户提供视觉上下文:

https://caliburnmicro.codeplex.com/wikipage?title=IResult%20and%20Coroutines&referringTitle=Documentation

这会在视觉树中搜索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->sync 好处,因为您使用的是 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 有一些不错的文档:

https://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=Documentation

于 2013-01-23T11:16:36.910 回答