1

チュートリアル サンプルの MainMenuView では、リストの代わりにディクショナリを使用します。wp7 では、次のようにバインドします。

 <ListBox ItemsSource="{Binding Items}" x:Name="TheListBox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Key}" Margin="12" FontSize="24" TextWrapping="Wrap">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Tap">
                                <commandbinding:MvxEventToCommand Command="{Binding Path=DataContext.ShowItemCommand, ElementName=TheListBox}" CommandParameter="{Binding Value}" />
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

しかしモノドロイドでは、CommandParameter="{Binding Value}" を mvxListView に配置する場所がわかりません。このエラーが発生します:"MvxBind:Error: 2,71 Problem seen during binding execution for from Items to ItemsSource - problem ArgumentException:私のaxmlコードからのパラメータの変換に失敗しました:

<Mvx.MvxBindableListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res/Tutorial.UI.Droid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="{'ItemsSource':{'Path':'Items'},'ItemClick':{'Path':'ShowItemCommand'}}"
local:MvxItemTemplate="@layout/listitem_viewmodel"

/>

wp7 のように CommandParameter プロパティを設定するにはどうすればよいですか?

よろしくお願いします。

指示 1 に従って、Tutorial.Core の MainMenuViewModel を次のように変更します。

`パブリック ディクショナリ アイテム { get; 設定; }

    public ICommand ShowItemCommand
    {
        get
        {
            return new MvxRelayCommand<KeyValuePair<string, Type>>((type) => DoShowItem(type.Value));
        }
    }

    public void DoShowItem(Type itemType)
    {
        this.RequestNavigate(itemType);
    }

    public MainMenuViewModel()
    {
        Items = new Dictionary<string, Type>()
                    {
                        {"SimpleTextProperty",  typeof(Lessons.SimpleTextPropertyViewModel)},
                        {"PullToRefresh",  typeof(Lessons.PullToRefreshViewModel)},
                        {"Tip",  typeof(Lessons.TipViewModel)},
                        {"Composite",typeof(Lessons.CompositeViewModel)},
                        {"Location",typeof(Lessons.LocationViewModel)}
                    };
    }`

サンプルは wp7 で期待どおりに動作していますが、モノドロイドでは、KeyValuePair Key プロパティが問題を引き起こしていると思われるため、前のエラーと同じエラーが発生します。

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:local="http://schemas.android.com/apk/res/Tutorial.UI.Droid"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
          android:layout_margin="12dp"
        android:orientation="vertical">
<TextView
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:text="View Model:"
        />
  <TextView
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:textAppearance="?android:attr/textAppearanceLarge"
          local:MvxBind="{'Text':{'Path':'Key'}}"
        />
</LinearLayout>
4

1 に答える 1

1

Mvx には現在、個別の CommandParameter 依存関係ターゲットがないため、現在、この問題に同じ方法で取り組むことはできません。

CommandParameters が含まれていない理由は設計上の選択であり、動作の欠如に関係しています。コントロール イベントの周りにコマンドとコマンド パラメータを一緒にラップする動作オブジェクトがないため、Click、LongClick、Swipe などには個別の CommandParameter バインディングが必要になります。 、私たちはこのアプローチを避けてきました。

ただし、探している効果と同様の効果を得る方法がいくつかあります。


まず、リストの ItemClick イベントは、パラメーターが常にクリックされたオブジェクトになるように常にバインドされます。そのため.Value、MvxRelayCommand アクション内で射影を行うことができれば、コードは WP7 と MonoDroid の両方で機能します。

つまり、これを達成できます。

<ListBox ItemsSource="{Binding Items}" x:Name="TheListBox">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Key}" Margin="12" FontSize="24" TextWrapping="Wrap">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Tap">
                            <commandbinding:MvxEventToCommand Command="{Binding Path=DataContext.ShowItemCommand, ElementName=TheListBox}" CommandParameter="{Binding}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

使用:

<Mvx.MvxBindableListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res/Tutorial.UI.Droid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="{'ItemsSource':{'Path':'Items'},'ItemClick':{'Path':'ShowItemCommand'}}"
local:MvxItemTemplate="@layout/listitem_viewmodel"
/>

コマンドハンドラーが.Value作業を行う場所:

public ShowItemCommand { get { return new MvxRelayCommand( item => { DoShowFor(item.Value); } ); } }


次に、リスト レベルのイベントにバインドするのではなく、各リスト アイテム内のビュー/コントロールの Click イベントにバインドすることを選択できます。これに関するいくつかの議論については、MvxBindableListView 内で ViewModel を変更する MVVMCrossに関する回答を参照してください。


第 3 に、この場合、本当に必要な場合は独自のバインドを作成できます...この状況ではやり過ぎだと思いますが、他の場合には役立つ可能性があります。


リスト選択の例については、BestSellers と CustomerManagement の例をご覧ください。

于 2012-10-15T10:22:12.647 に答える