- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理一个包含 TabControl
的项目.
在每个 TabItem
s 有一个 DataGrid
绑定(bind)到 ObservableCollection
在我的 View 模型中。
我需要绑定(bind)编辑Button
到DataGrid
目前是重点( TabItem
是重点)。
是否有可能在没有多个“硬”编码为一个 DataGrid
的按钮的情况下相当容易地完成此操作?/TabItem
并使用 MVVM 模式?
所以基本上这个顺序:TabControl
-> 已选TabItem
-> DataGrid
-> SelectedItem
示例 XAMLcode(基本上没有样式等的真实格式):
<Button Content="Edit"
Command="{Binding ExecuteEditMessmittelCommand}"
CommandParameter="{Binding ElementName=Messmittel_DataGrid, Path=SelectedItem}">
</Button>
<TabControl>
<TabItem Header="Messmittel">
<DataGrid x:Name="Messmittel_Datagrid"
ItemsSource="{Binding MessmittelDisplayCollection}">
<DataGrid.Columns>
<DataGridTextColumn Header="ID"
Binding="{Binding Path=Benutzer_ID}"
<DataGridTextColumn Header="Seriennummer"
Binding="{Binding Path=Seriennummer}"
<DataGridTextColumn Header="MessmittelArt"
Binding="{Binding Path=Vorname}"
</DataGrid.Columns>
</DataGrid>
</TabItem>
<TabItem Header="Mechanik">
<DataGrid x:Name="Mechanik_Datagrid"
ItemsSource="{Binding MechanikDisplayCollection}">
//here is the datagrid content
</DataGrid>
</TabItem>
<TabItem Header="Prüfhilfsmittel">
<DataGrid x:Name="Pruefhilfsmittel_Datagrid"
ItemsSource="{Binding PruefhilfsmittelDisplayCollection}">
//here is the datagrid content
</DataGrid>
</TabItem>
</TabControl>
查看模型(
SetProperty
只是触发
INotifyPropertyChanged
并设置值):
public ObservableCollection<MessmittelModel> MessmittelDisplayCollection
{
get { return DatabaseDisplayModel.MessmittelCollection; }
set { SetProperty(ref DatabaseDisplayModel.MessmittelCollection, value);}
}
public ObservableCollection<MessmittelModel> MechanikDisplayCollection
{
get { return DatabaseDisplayModel.MechanischeMessmittelCollection; }
set { SetProperty(ref DatabaseDisplayModel.MechanischeMessmittelCollection, value); }
}
public ObservableCollection<MessmittelModel> PruefhilfsmittelDisplayCollection
{
get { return DatabaseDisplayModel.PruefhilfsmittelCollection; }
set { SetProperty(ref DatabaseDisplayModel.PruefhilfsmittelCollection, value); }
}
在这种情况下,我认为我的 View 模型并不重要,但如果您需要更多信息,请告诉我,我会提供。
最佳答案
静态 MVVM 变体
我认为你必须分解你的主视图模型。您的主视图模型包含由 TabItems
内的数据网格绑定(bind)的列表。 .这个 View 模型很快就会变得臃肿,并且不能很好地分离 View 和关注点。相反,您应该有一个包含 TabControl
的 View 的主视图模型。以及选项卡控件中每个唯一 View 的单独 View 模型。
在您的示例中,一种 View 模型类型就足够了,因为所有三个选项卡都包含相同的控件,并且仅在 DataGrid
中显示一个列表。 .此 View 模型将公开集合以由 DataGrid
绑定(bind)。和当前选择的属性。您可以通过多种方式分配集合,从外部设置它,例如通过主视图模型,通过构造函数传递集合或为此传递服务。
public class MessmittelViewModel : BindableBase
{
private MessmittelModel _selected;
private ObservableCollection<MessmittelViewModel> _messmittelModels;
// ...constructor, initialization of properties, other properties.
public MessmittelModel Selected
{
get => _selected;
set => SetProperty(ref _selected, value);
}
public ObservableCollection<MessmittelModel> MessmittelDisplayCollection
{
get => _messmittelModels;
set { SetProperty(ref _messmittelModels, value);
}
}
在您的主视图模型中,您可以为每个选项卡公开一个 View 模型属性。
public class MainViewModel: BindableBase
{
private MessmittelViewModel _selectedViewModel;
private MechanischeMessmittel _mechanischeMessmittelViewModel;
// ...contructor, initialize properties, other code.
public MessmittelViewModel SelectedViewModel
{
get => _selectedViewModel;
set => SetProperty(ref _selectedViewModel, value);
}
public MechanischeMessmittelViewModel
{
get => _mechanischeMessmittelViewModel;
private set => SetProperty(ref _mechanischeMessmittelViewModel, value);
}
}
然后在你的 XAML 中绑定(bind)
SelectedItem
的
TabControl
和
DataContext
s 用于选项卡。
<TabControl SelectedItem="{Binding SelectedViewModel}">
<!-- ...other content. -->
<TabItem Header="Mechanik"
DataContext={Binding MechanischeMessmittelViewModel}">
<DataGrid ItemsSource="{Binding MessmittelDisplayCollection}">
<!-- ...data grid content. -->
</DataGrid>
</TabItem>
</TabControl>
现在您可以将命令参数绑定(bind)到
Selected
属性(property)...
<Button Content="Edit"
Command="{Binding ExecuteEditMessmittelCommand}"
CommandParameter="{Binding SelectedViewModel.Selected}"/>
...或访问您的
MainViewModel
中选择的 View 模型并得到它的
Selected
项目 list 。
var parameter = SelectedViewModel.Selected;
动态 MVVM 变体
MessmittelViewModel
如上和
FoobarMessmittelViewModel
.创建
ObservableCollection
基本类型,例如
MessmittelViewModelBase
和以前一样的选定属性。
public class MainViewModel: BindableBase
{
private MessmittelViewModelBase _selectedViewModel;
private ObservableCollection<MessmittelViewModelBase> _messmittelModels;
public MainViewModel()
{
// ...other code.
MessmittelViewModels = new ObservableCollection<MessmittelViewModelBase>();
MessmittelViewModels.Add(new MessmittelViewModel(DatabaseDisplayModel.MessmittelCollection));
// ...add view models for the other tabs.
}
// ...other code.
public MessmittelViewModelBase SelectedViewModel
{
get => _selectedViewModel;
set => SetProperty(ref _selectedViewModel, value);
}
public ObservableCollection<MessmittelViewModelBase> MessmittelViewModels
{
get => _messmittelModels;
set { SetProperty(ref _messmittelModels, value);
}
}
绑定(bind)
ItemsSource
到
MessmittelViewModels
收集并创建
DataTemplate
表示每个具体 View 模型类型的 View 。
<TabControl ItemsSource="{Binding MessmittelViewModels}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type MessmittelViewModel}">
<DataGrid ItemsSource="{Binding MessmittelDisplayCollection}">
<DataGrid.Columns>
<DataGridTextColumn Header="ID"
Binding="{Binding Path=Benutzer_ID}"
<DataGridTextColumn Header="Seriennummer"
Binding="{Binding Path=Seriennummer}"
<DataGridTextColumn Header="MessmittelArt"
Binding="{Binding Path=Vorname}"
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
<!-- ...other data templates -->
</TabControl.Resources>
</TabControl>
就是这样,
TabControl
现在将根据其类型为 View 模型集合中的每个项目创建一个适当的 View 。由于现在有不同的类型,您可以通过检查类型在代码中选择命令的参数(甚至可能为此选项卡启用它)。
if (SelectedViewModel is MessmittelViewModel messmittelViewModel)
{
var parameter = messmittelViewModel.Selected;
}
使用转换器的 MVVM 变体
public class SelectedIndexBindingConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[(int)values[0] + 1];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new InvalidOperationException();
}
}
在 XAML 中,您必须绑定(bind)
CommandParameter
像这样。
<Window.Resources>
<local:SelectedIndexBindingConverter x:Key="SelectedIndexBindingConverter"/>
</Window.Resources>
<Button Content="Edit"
Command="{Binding CommandTest}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource SelectedIndexBindingConverter}">
<Binding Path="SelectedIndex" ElementName="MyTabControl"/>
<Binding Path="SelectedItem" ElementName="Messmittel_Datagrid"/>
<Binding Path="SelectedItem" ElementName="Mechanik_Datagrid"/>
<Binding Path="SelectedItem" ElementName="Pruefhilfsmittel_Datagrid"/>
</MultiBinding>
</Button.CommandParameter>
</Button>
<TabControl x:Name="MyTabControl">
<!-- ...tab items as before. -->
</TabControl>
您还可以创建一个转换器来遍历可视化树并获取相应
DataGrid
的选定项, 没有绑定(bind)它,但这会假设一个视觉结构并且这个解决方案更健壮,因为你明确地指定了元素。事实上,这个转换器更灵活,因为它允许您将命令参数绑定(bind)到具有选项卡项中任何属性的任何控件。
关于c# - 将一个按钮绑定(bind)到 3 个不同的 DataGrids,每个 DataGrids 在 TabControl 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63668571/
所以我有这个 javascript 片段,它有两个按钮可以进入全屏,一个按钮可以退出全屏。我想做到这一点,如果我不在全屏模式下,按钮会显示转到全屏模式,而当我处于全屏模式时,按钮会显示退出全屏模式..
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我尝试将 Twitter 上的“Tweet Me”按钮 ( http://twitter.com/goodies/tweetbutton ) 添加到我的网站。然而,每当按下按钮时,我都会收到此 Jav
我试图在我的文本区域中获取一个按钮值,如果我使用 则工作正常但如果我使用那么它就不起作用了。你能找出问题所在吗? HTML 1 2 3 4 JavaScript $(document).read
我的 C# Winform 面板中有一堆文本框。每行文本框的命名如下: tb1 tbNickName1 comboBox1 tb2 tbNickName2 comboBox2 tb3 tbNickNa
我有一个表单,其中过滤器下方有按钮(应用过滤器和清除过滤器),我试图在单击“应用”按钮时显示“清除”,并在单击“清除”按钮时隐藏“清除”按钮。 下面的代码(如果我的表有的话):
excel 按钮正在工作,但是当我添加 pdf 按钮时,它添加仅显示 pdf 按钮 excel 按钮在 pdf 按钮添加后隐藏 $(document).ready(function() { $
我想创建一个 div 作为标题并分成 3 列,并按以下顺序在其中放置 2 个按钮和一个标题:Button1(左位) Title(居中) Button2(右位) 这是我为这个 div 编写的代码:
仅当选中所有框时才应禁用“允许”按钮。我该怎么做?我已经完成了 HTML 部分,如下所示。如何执行其中的逻辑部分?即使未选中一个复选框,也应禁用“允许”按钮
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
如您所知,您可以使用 2 种方法在 HTML5 中呈现按钮: 使用 void 元素 或 如果您需要内容,请使用 元素(不是空元素)。 在JSF2中,有2种方式生成按钮;与UICommand或 UIOu
我尝试根据表单元素的更改禁用/启用保存按钮。但是,当通过弹出按钮选择更改隐藏输入字段值时,保存按钮不受影响。 下面是我的代码。我正在尝试序列化旧的表单值并与更改后的表单值进行比较。但我猜隐藏的字段值无
我有用于在消息(电子邮件、短信)上输入内容的 EditText。我希望在单击 ActionDone 按钮时立即发布消息。我为此使用以下代码: message.setOnEditorActionList
我的 Android 应用程序中有一堆 EditText,每个都将 InputMethod 设置为 numberSigned。我的目标设备没有硬件键盘,而是使用软件键盘输入数字。 Android 将输
我无法以编程方式隐藏弧形菜单中的 fab 按钮。我正在使用https://github.com/saurabharora90/MaterialArcMenu在我的代码中。如何在Java中以编程方式隐藏
我已经看到这在其他类型的对话框窗口中是可能的,例如“showConfirmDialog”,其中可以指定按钮的数量及其名称;但是使用“showInputDialog”时是否可以实现相同的功能?我似乎无法
相同的按钮用于激活和停用。第一次,当代码运行按钮单击并成功“停用”时。但第二次,代码无法找到该元素。第一个案例按钮位于第二个“a”标签中,然后停用第一个“a”标签中的按钮。 案例1: Edit
是否可以将按钮的 onclick 操作设置为 JavaScript 变量?这个想法是我们用 JavaScript 控制一个表。每当点击该表的一行时,我们就会更新一个 JavaScript 变量。该 v
我想创建一个按钮,它包含左侧的文本和右侧的复选框(或任何其他组件)。我怎样才能做到这一点? 我发现我可以制作自己的 View extends Button,但是如果可以的话我应该如何实现 onDraw
我是一名优秀的程序员,十分优秀!