带上下文菜单的WPF按钮

时间:2013-12-23 14:42:37

标签: wpf button contextmenu

我是WPF的新手,我正在尝试使用来自视图模型的上下文菜单项将上下文菜单绑定到按钮。

这就是我在做的事情:

<Button x:Name="btn" Content="Context Menu">
  <Button.ContextMenu>
    <ContextMenu x:Name="cm" ItemsSource="ItemsList"/>
  </Button.ContextMenu>
</Button>

private List<string> itemsList = null;
public List<string> ItemsList
{
  get
  {
    if(itemsList == null)
      itemsList = new List<string>(myStringArrayOfItems);
    return itemsList;                
  }
}

XAML编辑器一直显示错误:“IEnumerable”的TypeConverter不支持从字符串转换。

我在这里做错了什么?

另外,假设我正常工作,我该怎么做才能将这些项绑定到命令并在单击该项时执行某些操作?我想对所有菜单项运行相同的命令,只需使用项字符串作为参数。

2 个答案:

答案 0 :(得分:6)

如果您执行ItemsSource="ItemsList",则不会绑定到ItemsList,但会将其设置为字符串ItemsList,从而导致错误。尝试像这样绑定它:

<ContextMenu x:Name="cm" ItemsSource="{Binding Path=ItemsList}"/>

至于Command部分,您需要实现ICommand界面(例如here),然后将其绑定到ItemContainerStyle中:

<ContextMenu ...>
   <ContextMenu.ItemContainerStyle>
      <Style TargetType="{x:Type MenuItem}">
         <Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=PlacemantTarget.DataContext.ItemChanged }"/>
         <Setter Property="CommandParameter" Value="{Binding}"/>
      </Style>
   </ContextMenu.ItemContainerStyle>
</ContextMenu >

答案 1 :(得分:1)

  

XAML

<Button  Content="0k">
        <Button.ContextMenu>
            <ContextMenu x:Name="cm" ItemsSource="{Binding ItemsList}" />
        </Button.ContextMenu>
    </Button>
  

xaml.cs

public MainWindow()
    {
        InitializeComponent();
        DataContext = new MyViewModel();
    }
  

视图模型

    public class MyViewModel : INotifyPropertyChanged
{

    public MyViewModel()
    {
        ItemsList = new List<string> { "abc", "xyz" };
    }

    private List<string> itemsList = null;

    public List<string> ItemsList
    {
        get
        {
            return itemsList;
        }
        set
        {

            if (itemsList == null)
            {
                itemsList = value;
                Notify("ItemsList");
            }

        }
    }

    private void Notify(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }

    public event PropertyChangedEventHandler PropertyChanged;

}

我希望这会有所帮助。