1

我在列表框中有一个按钮。我想将命令绑定到主网格的 DataContext。我不确定谁来做这件事,下面是我的尝试。

我想绑定到我的视图模型上的 ViewModel.SelectionEditorSelectionSelectedCommand,主网格绑定到,我不想绑定到实际的 filteredSelection.SelectionEditorSelectionSelectedCommand

这是我的 XAML

<Grid Name="MainGrid">
   .....
    <ListBox x:Name="MarketsListBox"  Height="Auto" MaxHeight="80" ItemsSource="{Binding Path=FilteredMarkets}" Margin="5" Width="Auto" HorizontalAlignment="Stretch"
                 >
          ListBox.ItemTemplate>
                    <DataTemplate>
                        <WrapPanel Orientation="Horizontal">
                            <Button Height="Auto" 
                                    Content="{Binding FinishingPosition,Converter={StaticResource FinishingPositionToShortStringConverter1}}" 
                                    Foreground="{Binding Path=FinishingPosition, Converter={StaticResource FinishingPositionToColourConverter1}}" 
                                    Margin="2" Width="20"
                                    Command="{Binding ElementName=MainGrid.DataContext, Path=SelectionEditorSelectionSelectedCommand}" 
                                    CommandParameter="{Binding}"
                                    />
    .....
4

3 回答 3

2

使用绑定到网格应该ElementName可以,但是您在绑定语法中犯了一个小错误。ElementName必须包含名称,而不是属性。您只需要包含DataContextPath

Command="{Binding ElementName=MainGrid,
                  Path=DataContext.SelectionEditorSelectionSelectedCommand}"
于 2013-10-02T15:13:36.397 回答
1

所以基于这一行:

Command="{Binding ElementName=MainGrid.DataContext ... }

我假设你有这样的事情:

<Grid Name="MainGrid">
    <Grid.DataContext>
        <lol:GridViewModel /> <!--Some kind of view model of sorts-->
    </Grid.DataContext>
    ... content
</Grid>

然后您所要做的就是在 ViewModel 类上创建一个返回某种 的公共属性ICommand,例如:

class GridViewModel {
    public ICommand SelectionEditorSelectionSelectedCommand { 
        get { return new TestCommand(); } 
    }
}

将在哪里TestCommand实现某种类,ICommand如下所示:

class TestCommand : ICommand {
    public event EventHandler CanExecuteChanged { get; set; }

    public bool CanExecute(object parameter)
    {
        return true; // Expresses whether the command is operable or disabled.
    }

    public void Execute(object parameter)
    {
         // The code to execute here when the command fires.
    }
}

基本上,ICommand您只需要定义命令时会发生什么Executes,如何确定它是否CanExecute,然后为 when 提供事件句柄CanExecuteChanged。一旦你完成了这个设置,你所要做的就是像这样连接你的按钮:

<Button Command="{Binding SelectionEditorSelectionSelectedCommand}" />

就是这样。基本上,绑定将自动检查您的 ViewModel 类是否有一个名为 的属性SelectionEditorSelectionSelectedCommand,该属性实现了ICommand。当它读取属性时,它将实例化 的实例TestCommand,WPF 将从那里处理它。当按钮被点击Execute时会像发条一样被触发。

于 2013-10-02T15:09:07.580 回答
0

您应该像我在类似情况下所做的那样尝试:

<Button Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Grid}}, Path=DataContext.YOURCOMMANDHERE}" />

我在 TabItem Header 中有一个按钮,它工作正常!问题是,您的命令是 DataContext 的属性,因此您的路径应该指出它。

祝你好运!

编辑: Elementname 也可以工作。

于 2013-10-02T15:02:59.937 回答