在wpf </keyvalue>中绑定ComboBox和ObservableCollection <keyvalue>

时间:2013-01-23 09:44:25

标签: wpf xaml observablecollection caliburn.micro

在我的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

2 个答案:

答案 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类,它有助于为用户提供可视化上下文:

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-&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有一些不错的文档:

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