0

Selected MenuItem の Text/Header 文字列を MethodParameter として ObjectDataProvider に渡そうとしています。このような例をインターネットで見たことがありますが、特にメニュー コントロールに適応させることはできませんでした。私はWPFが初めてで、これを達成するための助けが必要です。どんな助けでも大歓迎です。

以下はコード スニペット、ObjectDataProvider の XAML です。

<Window.Resources>
    <ObjectDataProvider x:Key="NMInfo" ObjectType="{x:Type local:NMInfoProvider}" MethodName="GetDcmsInfomation" IsAsynchronous="True">
        <ObjectDataProvider.MethodParameters>
            <x:Static Member="system:String.Empty" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

メニュー コントロールの XAML

<Menu Name="nmMenu" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Top" FontSize="12" DockPanel.Dock="Top">

        <Menu.BitmapEffect>
            <DropShadowBitmapEffect/>
        </Menu.BitmapEffect>
        <MenuItem Header="File">

            <MenuItem Header="SNYC12P10650" IsCheckable="True" ToolTip="Production" Click="MenuItem_Clicked">
                <MenuItem.IsChecked>
                    <Binding Source="{StaticResource NMInfo}" Path="MethodParameters[0]" BindsDirectlyToSource="True" Mode="OneWayToSource"/>
                </MenuItem.IsChecked>
            </MenuItem>
            <MenuItem Header="GPRI12D10217" IsCheckable="True" ToolTip="QA" Click="MenuItem_Clicked">
               <MenuItem.IsChecked>
                    <Binding Source="{StaticResource NMInfo}" Path="MethodParameters[0]" BindsDirectlyToSource="True" Mode="OneWayToSource"/>
                </MenuItem.IsChecked>
            </MenuItem>
            <MenuItem Header="GPRI12D10219" IsCheckable="True" ToolTip="Dev" Click="MenuItem_Clicked">
                <MenuItem.IsChecked>
                    <Binding Source="{StaticResource NMInfo}" Path="MethodParameters[0]" BindsDirectlyToSource="True" Mode="OneWayToSource"/>
                </MenuItem.IsChecked>
            </MenuItem>
            <Separator/>
            <MenuItem Header="Close"/>
        </MenuItem>

    </Menu>
4

1 に答える 1

0

あなたがする必要があるのは、IsChecked ではなく、Header プロパティをバインドすることです。ただし、アイテムがチェックされているときにのみこれを行いたいと思います。これは MenuItem に Style を使用することで実現できますが、ViewModel でこの種の作業を行うことをお勧めします。

ObjectDataProvider を持つ代わりに、VM はチェック可能なメニュー項目ごとにブール値のプロパティを公開します。これらのプロパティのいずれかが変更されると、そのメソッド自体が呼び出され、オブジェクトが読み取り専用プロパティとして公開されます。コントロール全体の DataContext を VM のインスタンスに設定するだけで、バインディングが機能します。

そのようなもの:

public class NMInfoViewModel : INotifyPropertyChanged
{
    private bool isSNYC12P10650 = false;
    public bool IsSNYC12P10650
    {
        get { return isSNYC12P10650; }
        set
        {
            if (value == isSNYC12P10650) return;
            isSNYC12P10650 = value;
            OnPropertyChanged("IsSNYC12P10650");

            if (value)
                NMInfo = NMInfoProvider.GetDcmsInfomation("SNYC12P10650");
        }
    }

    ...

    private NMInfo nMInfo;
    public NMInfo NMInfo
    {
        get { return nMInfo; }
        private set
        {
            if (value == nMInfo) return;
            nMInfo = value;
            OnPropertyChanged("NMInfo");
        }
    }
}

MenuItems は次のようになります。

<MenuItem Header="SNYC12P10650" IsCheckable="True" 
     ToolTip="Production" IsChecked="{Binding IsSNYC12P10650}" />
于 2010-03-10T22:14:21.880 に答える