gpt4 book ai didi

wpf - 将 ListViewItem ContextMenu MenuItem 命令绑定(bind)到 ListView 的 ItemsSource 的 ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:31:30 26 4
gpt4 key购买 nike

我有一个 ListViewExpander s。每个Expander (代表一个数据库表)下面会有项目,在另一个 ListView .我想右键单击并在最里面的项目上有一个“编辑”选项,这些项目代表相应数据库表中的记录。

有一个ICommand在我的 MainEditorViewModel 中命名为“编辑” .该命令所在的Datacontext与最外层的ListView相同名为“TestGroupsListView”

这是扩展器的 ListView 的 XAML 标记。我为通过 ElementName 在绑定(bind)中引用而命名的最外层 ListView对于MenuItemBinding :

        <ListView Name="TestGroupsListView" ItemsSource="{Binding TestGroups}" Grid.Row="1">
<ListView.ItemTemplate>
<DataTemplate>


<Expander Style="{StaticResource MaterialDesignExpander}" >
<Expander.Header>
<Grid MaxHeight="50">
<TextBlock Text="{Binding Name}"/>
<Grid.ContextMenu>

<ContextMenu>
<MenuItem Header="Add..." Command="{Binding Add}"/>
</ContextMenu>
</Grid.ContextMenu>
</Grid>

</Expander.Header>

<ListView ItemsSource="{Binding Records}" Style="{StaticResource MaterialDesignListView}" Margin="30 0 0 0">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit"
Command="{Binding ElementName=TestGroupsListView, Path=DataContext.Edit}"
CommandParameter="{Binding }"/>
</ContextMenu>
</Grid.ContextMenu>

<Button Content="{Binding RecordName}" Command="{Binding ElementName=TestGroupsListView, Path=DataContext.Edit}"/>
<!--<TextBlock Text="{Binding RecordName}" AllowDrop="True"/>-->
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Expander>
</DataTemplate>
</ListView.ItemTemplate>

</ListView>

我能够成功地将 DataTemplate 中的按钮绑定(bind)到“编辑”,但是当我尝试绑定(bind) MenuItem 时的 Command到“编辑”,没有任何 react 。为什么这可能是按钮命令绑定(bind)使用 ElementNameContextMenu 中的绑定(bind)相同不是吗?

最佳答案

我认为最好为 ListView 全局使用上下文菜单,为每个子 ListView 全局使用上下文菜单。好的,这是我的解决方案:

<ListBox ItemsSource="{Binding Groups}">
<ListBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Add..." Command="{Binding Add}"/>
</ContextMenu>
</ListBox.ContextMenu>
<ListBox.ItemTemplate>
<DataTemplate>
<Expander Header="{Binding Name}">
<ListView ItemsSource="{Binding Records}" SelectedItem="{Binding SelectedRecord}">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit" Command="{Binding Edit}" IsEnabled="{Binding CanEdit}"/>
</ContextMenu>
</ListView.ContextMenu>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Expander>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

为了更好地理解背后的代码:
public class GroupsVM : ViewModelBase
{
public ICommand Add
{
get => null; //Command implementation
}

public ObservableCollection<GroupVM> Groups { get; set; } = new ObservableCollection<GroupVM>()
{
new GroupVM { Name = "First" },
new GroupVM { Name = "Second" },
new GroupVM { Name = "Third" }
};
}

public class GroupVM : ViewModelBase
{
private string _name;

public string Name
{
get => _name;
set { _name = value; OnPropertyChanged(); }
}

public ICommand Edit
{
get => null; //Command implementation
}

public bool CanEdit => SelectedRecord != null;

public ObservableCollection<RecordVM> Records { get; set; } = new ObservableCollection<RecordVM>()
{
new RecordVM { Name="Record1" },
new RecordVM { Name="Record2" },
new RecordVM { Name="Record3" }
};

private RecordVM _selectedRecord = null;

public RecordVM SelectedRecord
{
get => _selectedRecord;
set
{
_selectedRecord = value;
OnPropertyChanged();
OnPropertyChanged("CanEdit");
}
}
}

public class RecordVM : ViewModelBase
{
private string _name;

public string Name
{
get => _name;
set { _name = value; OnPropertyChanged(); }
}
}

关于wpf - 将 ListViewItem ContextMenu MenuItem 命令绑定(bind)到 ListView 的 ItemsSource 的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60958174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com