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を呼び出して、COmboBoxに入力するにはどうすればよいですか?

どうも

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=ドキュメント

これはビジュアル ツリーでコントロールを検索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 アクションをバインドできるようになり、コルーチンがより多くのコンテキスト情報を取得できるようになるためです。

明らかに、WPF を使用しているため、Silverlight で得られる async->sync の利点について心配する必要はあまりありませんが (ただし、非同期 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=ドキュメント

于 2013-01-23T11:16:36.910 に答える