1

Caliburn Micro 1.5.1 を使用して、設計時のバインディングを WP8 アプリで動作させようとしています。PhoneApplicationPage で明示的に指定する設計時の ViewModel を作成しました。

<phone:PhoneApplicationPage
    d:DataContext="{Binding Source={d:DesignInstance Type=designTime:StartPageDesignTimeViewModel, IsDesignTimeCreatable=True}}"
    micro:Bind.AtDesignTime="True"

このページは、Telerik の RadDataBoundListBox にすぎません。

<Grid x:Name="ContentPanel">
    <telerikPrimitives:RadDataBoundListBox x:Name="Rooms"  ...>

ご覧のとおり、私の ViewModel (および設計時のビュー モデル) には、名前付き規則アプローチを使用して ItemsSource コレクションにバインドしている Rooms という名前のパブリック プロパティがあります。ただし、ItemsSource プロパティを追加しない限り、このアプローチは設計時には機能しません。

<Grid x:Name="ContentPanel">
    <telerikPrimitives:RadDataBoundListBox x:Name="Rooms" ItemsSource="{Binding Rooms}" ...>

ただし、ItemsSource バインディングを使用すると、SelectedItem のような CM ワイヤアップ マジックが失われます。設計時の属性以外でページを変更せずに、命名規則のアプローチを使用してバインディングを設計時に機能させる方法はありますか?

4

1 に答える 1

2

わかりました、私はそれを理解しました。私が探していたのは、既存のバインディングを常に上書きできる機能でした。CM はそれよりも防御的であるため、デフォルトでは、ItemsControl の既存のバインディングまたは値を置き換えません。この動作は、ConventionManager.cs で次のように定義されています。

AddElementConvention<ItemsControl>(ItemsControl.ItemsSourceProperty, "DataContext", "Loaded")
.ApplyBinding = (viewModelType, path, property, element, convention) => {
    if (!SetBindingWithoutBindingOrValueOverwrite(viewModelType, path, property, element, convention, ItemsControl.ItemsSourceProperty)) {
        return false;
    }

    ApplyItemTemplate((ItemsControl)element, property);

    return true;
};

フレームワークにバインディングを常に置き換えるように強制するために私がしたことは、BootStrapper でのSetBindingWithoutBindingOrValueOverwrite呼び出しを への直接呼び出しに置き換えることでした。SetBindingそう:

ConventionManager.AddElementConvention<ItemsControl>(ItemsControl.ItemsSourceProperty, "DataContext", "Loaded")
             .ApplyBinding = (viewModelType, path, property, element, convention) => {
                                 ConventionManager.SetBinding(viewModelType, path, property, element, convention, ItemsControl.ItemsSourceProperty);

                                 ConventionManager.ApplyItemTemplate((ItemsControl) element, property);
                                 return true;
                             };

(以前に RadDataBoundListBox に追加した規則にもこの編集を加える必要がありました)

場合によっては、誰かが既存のバインディングを宣言的に強制的に置き換えたいと思うかもしれません。パッチを書くかも…

于 2013-05-03T05:57:29.603 に答える