0

コマンドがViewModelにバインドされているMenuItemがいくつかあります。今日まで、それらはすべて適切に実行されます。

ここで、ItemsSourceがObservableCollectionにバインドされているMenuItemを追加しました。このMenuItemのポイントは、すべてのプラグインの名前が表示されるようにプラグインのリストを列挙することです。次に、ユーザーがプラグイン名をクリックすると、オーディオフィルターのプロパティを表示する関数を呼び出す必要があります。

動作しない現在の実装では、次のようにデータバインドを試みました。

<MenuItem Header="Filters" ItemsSource="{Binding FilterPluginNames}">
    <MenuItem.ItemContainerStyle>
        <Style>
            <Setter Property="MenuItem.Command" Value="{Binding ShowFilterDialogCommand}" />
        </Style>
    </MenuItem.ItemContainerStyle>
</MenuItem>

問題は、MenuItemのDataContextとして文字列を使用しようとしているため、BindingExpressionパスエラーが発生することです。

これにより、MenuItemのMenuItemsのDataContextは、ItemsSource内のオブジェクトのタイプに自動的に設定されると思います。これは本当ですか?

DataContextを変更する必要がある場合は、他のすべてのコマンドを処理するViewModelに変更したいと思います。しかし、そうすると、フィルターのプロパティを表示するプラグインを世界でどのように判断できるのでしょうか。少なくともCommandParameterを渡す必要がありますが、この値をフィルター名にバインドすることは、私の最も好きなオプションではありません。これを行う他の方法はありますか?

DataContextが実際にObservableCollectionのオブジェクトタイプに自動的に設定されている場合は、インターフェイスメソッドShowFilterProperties()を直接呼び出すだけです。コマンドバインディングなしではこれを行うことはできないに違いありません。その場合、この種のアプリケーションにどのように対処しますか?すべてのプラグインにコマンドハンドラーを公開させますか?コマンドハンドラーはダイアログを表示しますか?

編集-ObservableCollectionタイプを変更するようにコードを変更しました。確かに、WPFはタイプTにデータバインドしたいと考えています。したがって、1つのオプションは、プラグインにICommandを公開させることだと思いますが、これが奇妙なアプローチかどうか?

編集-わかりました、私はちょうど何か新しいことを学びました。インターフェイスはフィールドを持つことができないので、プラグインとデータバインドすることはできませんか?

4

1 に答える 1

1

You are likely not quite binding like you think you are. You might want to just put some diagnostics on your bindings and see what object they are binding to. Here is a good link for debugging bindings:

http://www.beacosta.com/blog/?p=52

Here's a sample:

<Window …
    xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    />

    <TextBlock Text="{Binding Path=Caption, diagnostics:PresentationTraceSources.TraceLevel=High}" … />

I think your approach is correct... it probably just needs to be debugged a little.

于 2010-01-27T17:52:36.617 に答える