WPF Pass MenuItem выбран в качестве MethodParameter для ObjectDataProvider - PullRequest
0 голосов
/ 10 марта 2010

Я пытаюсь передать выбранную строку текста / заголовка элемента MenuItem в качестве параметра метода для моего ObjectDataProvider. Я видел подобные примеры в Интернете, но не смог адаптировать его специально для управления меню. Я новичок в WPF и мне нужна помощь для достижения этой цели. Любая помощь будет принята с благодарностью.

Ниже приведен фрагмент кода XAML для ObjectDataProvider

<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>

1 Ответ

0 голосов
/ 11 марта 2010

Что вам нужно сделать, это связать свойство заголовка, а не IsChecked. Я предполагаю, что вы хотите сделать это только тогда, когда пункт проверен. Хотя это было бы возможно при использовании Style для MenuItem, я бы рекомендовал выполнять такую ​​работу в ViewModel.

Вместо того чтобы иметь ObjectDataProvider, ваша виртуальная машина будет предоставлять логические свойства для каждого из проверяемых пунктов меню. Когда любое из этих свойств изменилось, он мог вызвать сам этот метод и выставить объект как свойство только для чтения. Просто установите DataContext всего элемента управления на экземпляр вашей виртуальной машины, и привязки будут работать.

Примерно так:

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}" />
...