【问题标题】:WPF 2D-array binding and ContextmenuWPF 二维数组绑定和上下文菜单
【发布时间】:2014-08-08 21:54:06
【问题描述】:

我在 WPF 中遇到 commandS-BINDING 的问题。我尝试使用 ItemsControls 显示二维数组,我有以下代码:

xaml:

<ItemsControl x:Name="Lst" ItemsSource="{Binding Items}" ItemTemplate="{DynamicResource DataTemplateLevel1}"/>

<DataTemplate x:Key="DataTemplateLevel1">
    <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource FirstTemplate}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</DataTemplate>


<DataTemplate x:Key="FirstTemplate" >
    <Border BorderThickness="1" BorderBrush="Black" Margin="3, 3, 3, 3" 
            Tag="{Binding DataContext, ElementName=Lst}">
        <Border.ContextMenu>
            <ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" Tag="{Binding Items}" >
                <MenuItem Header="Delete" Command="{Binding SomeCommand}" 
                          CommandParameter="What should i write here?" />
            </ContextMenu>
        </Border.ContextMenu>

        <Grid  Background="MediumSeaGreen"  >
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>

            <Label Grid.Row="0" Grid.Column="0" Name="IdLabel" Content="{Binding Id}"  />
            <Label Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left"     
                   Foreground="White" Margin="5, 0, 0, 0" 
                   FontSize="20" FontWeight="Heavy"  Content="{Binding Name}"   />                    
        </Grid>
    </Border>
</DataTemplate>

我有 ViewModel:

public class ViewModel 
{
    public List<List<Model>> Items
    {
        get
        {
            var lsts = new List<List<Model>>();

            for (int i = 0; i < 5; i++)
            {
                var range = new List<Model>();

                for (int j = 0; j < 5; j++)
                    range.Add(new Model{ Id = i*5 + j, Name = "Some item" });

                lsts.Add(range);
            }

            return lsts;
        }
    }

    private readonly ICommand _command = new MyCommand();

    public ICommand SomeCommand { get { return _command; } }
}

当我单击 ContextMenu 的项目时,命令 SomeCommand 正在触发。但我不能传递给这个命令参数。 ContextMenu 的 DataContext 绑定到 Border.Tag 绑定到名为 Lst 的元素的 DataContext,现在我无法将命令参数绑定到名为 IdLabel 的标签的内容。

总结:

我想将 MenuItem 的命令绑定到 ItemsControl 的 DataContext(元素 Lst),并且我想将命令参数绑定到此 itemsControl 的项的 DataContext(到 IdLabel 的内容)

我该怎么做?预先感谢!

【问题讨论】:

    标签: c# wpf xaml mvvm data-binding


    【解决方案1】:

    根据您的模板和数据模型,这应该可以工作

            <ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}" Tag="{Binding Tag.Items}" >
                <MenuItem Header="Delete" Command="{Binding Tag.SomeCommand}" 
                          CommandParameter="{Binding DataContext}" />
            </ContextMenu>
    

    假设 PlacementTarget(Border) 是您尝试将其 DataContext(Model) 传递给命令的元素

    如果您希望传递 Model 的 Id 属性,只需重写为

            <ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}" Tag="{Binding Tag.Items}" >
                <MenuItem Header="Delete" Command="{Binding Tag.SomeCommand}" 
                          CommandParameter="{Binding DataContext.Id}" />
            </ContextMenu>
    

    【讨论】:

    • 是否有绑定错误?你可以从输出窗口看到。顺便说一句,您能在标签中看到名称和 ID 吗?
    • 是的,我有一个错误。当我尝试此操作时:CommandParameter="{Binding PlacementTarget.DataContext.Id}" 我有以下错误:>BindingExpression 路径错误:在 'object' ''ViewModel' (HashCode=19896347)' 上找不到 'PlacementTarget' 属性。 BindingExpression:Path=PlacementTarget.DataContext.Id; DataItem='ViewModel' (HashCode=19896347);目标元素是'MenuItem'(名称='');目标属性是'CommandParameter'(类型'Object')
    • 是的,请问那是什么?还请确认您可以在标签中看到姓名和 ID。
    • 我在上面描述了这个错误,但由于某种原因,我无法在该评论中正确格式化代码(
    • 我的错我忽略了 ContextMenu 中的 DataContext,也忘记定义 RelativeSource,反正我已经更正了答案。我更改了 ContextMenu 的 DataContext 和 Tag,MenuItem 的 Command 和 CommandParameter 绑定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2018-03-22
    • 1970-01-01
    • 2011-12-08
    • 2012-02-22
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多