数据模板是WPF的一项功能,可让您自定义数据的表示。
我正在编写一个复合松散耦合的 MVVM WPF 应用程序,父 VM 中的子 VM 是接口而不是类实例,例如 公共 IChildViewModel { 获取;放; } 现在我该如何渲染...
我正在使用 DataTemplateSelector 根据枚举值选择 ListBox 项目的 DataTemplates。 公共类MenuBarDataTemplateSelector:DataTemplateSelector { 公共覆盖数据模板
DataBinding - 值通过 DataTemplate 不可见
我的 xaml 中有以下 DataTemplate: 我的 xaml 中有以下 DataTemplate: <DataGrid x:Name="ChecklistDataGrid" AutoGenerateColumns="False" HorizontalAlignment="Stretch" Foreground="White" VerticalAlignment="Stretch" Background="Transparent" RowBackground="Transparent" AlternatingRowBackground="Transparent" HorizontalGridLinesBrush="White" VerticalGridLinesBrush="White" CanUserAddRows="False" SelectionUnit="Cell"> <DataGrid.Resources> <!-- Custom Style for DataGridColumnHeader --> <Style TargetType="DataGridColumnHeader"> <Setter Property="Background" Value="Transparent"/> <Setter Property="BorderBrush" Value="Transparent"/> <Setter Property="Foreground" Value="White"/> </Style> <!-- DataTemplate for Buttons --> <DataTemplate x:Key="ButtonTemplate"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Button Content="IO" Background="Green" Click="IOButton_Click" HorizontalAlignment="Stretch" Grid.Column="0"/> <Button Content="NIO" Background="Red" Click="NIOButton_Click" HorizontalAlignment="Stretch" Grid.Column="1"/> <Button Content="NR" Background="DarkGray" Click="NRButton_Click" HorizontalAlignment="Stretch" Grid.Column="2"/> </Grid> </DataTemplate> <!-- DataTemplate for TextBox with NR Button --> <DataTemplate x:Key="TextBoxTemplate"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <TextBox Text="{Binding Pruefwert, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Background="White" HorizontalAlignment="Stretch" Grid.Column="0" Grid.ColumnSpan="2" TextChanged="TextBox_TextChanged"/> <Button Content="NR" Background="DarkGray" Click="NRButton_Click" HorizontalAlignment="Stretch" Grid.Column="2"/> </Grid> </DataTemplate> </DataGrid.Resources> <DataGrid.Columns> <DataGridTextColumn Header="Pruefpunkt" Binding="{Binding Pruefpunkt}" Width="1*"/> <!-- Wrapping Text Column --> <DataGridTemplateColumn Header="Content" Width="10*"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Content}" TextWrapping="Wrap" Background="{Binding ContentBackground}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <!-- Conditional Column for Buttons or TextBox --> <DataGridTemplateColumn Header="Actions" Width="3*"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <ContentControl> <ContentControl.Style> <Style TargetType="ContentControl"> <Style.Triggers> <DataTrigger Binding="{Binding Type}" Value="button"> <Setter Property="ContentTemplate" Value="{StaticResource ButtonTemplate}" /> </DataTrigger> <DataTrigger Binding="{Binding Type}" Value="text"> <Setter Property="ContentTemplate" Value="{StaticResource TextBoxTemplate}" /> </DataTrigger> </Style.Triggers> </Style> </ContentControl.Style> </ContentControl> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn Header="Pruefpunkt" Binding="{Binding Pruefwert}" Width="1*"/> </DataGrid.Columns> </DataGrid> 我遇到的问题是,Pruefwert 的值在文本框中不可见。对于数据模板文本框模板 我在末尾添加了一个额外的 DataGridTextColumn,具有相同的 DataBinding,这里的值是可见的,没有任何问题。所以数据模板肯定存在一些绑定问题。而且我没有收到任何绑定错误。 为了应用 DataTemplate,首先必须有某个要应用它的对象。对于 ContentTemplate,此对象将是 Content 属性的值。但你这个属性里什么都没有,它被设置为null。 参见示例: <StackPanel> <FrameworkElement.Resources> <DataTemplate x:Key="point.template" DataType="Point"> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding X}" Margin="5"/> <TextBlock Text="{Binding Y}" Margin="5"/> </StackPanel> </DataTemplate> </FrameworkElement.Resources> <FrameworkElement.DataContext> <Point X="123" Y="456"/> </FrameworkElement.DataContext> <ContentControl ContentTemplate="{DynamicResource point.template}"/> <ContentControl ContentTemplate="{DynamicResource point.template}" Content="{Binding}"/> </StackPanel>
使用 VisualStateManager 在数据模板中实现 WPF 动画
当您尝试为某些数据模板输入 VisualStates 时,这是非常常见的问题。 下面的代码工作正常,但前提是我使用 FrameworkElement,例如自定义 UserControl: 当您尝试输入 VisualStates 来表示某些 DataTemplate 时,这是很常见的问题。 下面的代码工作正常,但前提是我使用 FrameworkElement,例如自定义 UserControl: <UserControl> <!-- Namespaces go here --> <Grid x:Name="rootgrid"> <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="States"> <Storyboard x:Key="Focused"> <ColorAnimationUsingKeyFrames Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"> <EasingColorKeyFrame KeyTime="0:0:0.1" Value="#FFE90B0B"/> </ColorAnimationUsingKeyFrames> </Storyboard> </VisualStateGroup> </VisualStateManager.VisualStateGroups> <Ellipse x:Name="ellipse" Width="26" Height="26" Fill="Yellow" SnapsToDevicePixels="True" Stretch="Fill" Stroke="Black" StrokeThickness="2"> <Ellipse.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform/> <TranslateTransform/> </TransformGroup> </Ellipse.RenderTransform> </Ellipse> </Grid> </UserControl> 但是当我尝试将代码粘贴到DataTemplate中时: <DataTemplate x:Key="MyDataTemplate"> <Grid x:Name="rootgrid"> ... Code the same as above... </Grid> </DataTemplate> 然后我将“MyDataTemplate”应用到我的自定义元素(类,它实现 ContentTemplate 依赖属性),在这种情况下我无法使用动画状态“Focused”。 即使我通过 VisualTree 获得一个名为“rootgrid”的网格对象并使用它: VisualStateManager.GoToState(rootgrid, "Focused", true); 什么也没发生...:( 问题是如何将 VisualStates 中实现的 DataTemplate(动画)用于非 FrameworkElement 对象? 对于OP来说,答案可能为时已晚,但对于其他遇到这个问题的人来说: 可以在 VisualStateManager 中使用 DataTemplate。关键是使用包含 VisualStateManager.GoToElementState 的 VisualStateManager.GoToState 来调用 FrameworkElement 而不是 VisualStateManager。 顺便说一句,上面的 XAML 没有正确指定 Focused 的 VisualState,应该更改为: <VisualStateManager.VisualStateGroups> <VisualStateGroup x:Name="States"> <VisualState Name="Focused"> <StoryBoard> 等等
我有一个包含两个数据模板的资源字典。每个模板都有一个带有对象的堆栈面板。 根据我从其他地方获得的条件,在我的代码后面,我想嵌入其中之一
如何为 WPF TreeView 设置 DataTemplate 以显示列表的所有元素?
我想在 WPF 中使用 TreeView 可视化以下数据结构: 类 MyDataContext { ICollectionView 外部 {get;set;} //... } 类外层 { 字符串名称 {get;set;}
无法在“Node”上执行“removeChild”:要删除的节点不是该节点的子节点。使用数据表
我正在使用数据表,这是我的反应代码,每次我进行任何更新时都会出现 Failed toexecute 'removeChild' 如何修复它? 我尝试使用 ChatGPT 和 CaludeAi 但它们都不起作用......
在 DataTemplate 内部使用 TreeView 层次结构和 HierarchicalDataTemplate
我有一个使用 TreeView 的 WPF 应用程序,该 TreeView 内部有多个不同类型的 HierarchicalDataTemplates/DataTemplates,每个模板都包含一个具有特定
DataTemplate是否可以组合或继承(类似于Styles中的“BasedOn”)?有两个例子我需要它。 对于继承的类:我有一个带有几个
Avalonia - 根据集合值更改 DataTemplate 会引发 ArgumentOutOfRangeException
我正在学习 Avalonia,并尝试根据自定义对象的 ObservableCollection 中的属性在两个不同的 DataTemplate 之间进行 ItemsControl 切换。 我有一个 ObservableCollecti...
WPF - 绑定到不同 ItemSource 内的 Ancestor 可以工作,但会导致错误
我正在尝试将 DataTemplate 内标签的前景绑定到祖先,这是摘录: 视图模型代码 公共类设备概述 { 公共字符串设备名{获取; ...
如何通过带有 TextBox 作为 TreeViewItems 的 ListView 进行 TAB 操作?
所以我基本上有这个ListView,我想按Tab键并迭代我的TreeViewItems(最好只有我的TextBoxes) 所以我基本上有这个 ListView,我想按 Tab 并迭代我的 TreeViewItems(最好只有我的 TextBoxes) <ListView> <ListView.View> <GridView> <GridViewColumn Header="number" /> <GridViewColumn Header="Selector"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBox Text="{Binding SelectorName}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView> 我看到的场景是第一次按下选项卡后,整个第一个 TreeViewItem 被选中,再次按下选项卡,第一个文本框被选中。最后,第三个选项卡从 TreeView 中移出到下一个控件,尽管还有更多的文本框我想在“标记”到下一个控件之前捕获它。 谢谢 编辑: 问题在这里得到了回答: 如何在 ListView 中通过 TextBox 进行 TAB 操作 查看KeyboardNavigation.TabNavigation附加属性 也许我遗漏了一些东西,但我找不到任何简单的方法来做到这一点,这里是你可以做什么的概述: <ListView.InputBindings> <KeyBinding Key="Tab" Command="{Binding GoToNextItem}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" /> <KeyBinding Modifiers="Shift" Key="Tab" Command="{Binding GoToPreviousItem}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" /> </ListView.InputBindings> <ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <EventSetter Event="Selected" Handler="ItemSelected" /> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn Header="number" /> <GridViewColumn Header="Selector"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBox Name="_tb" Text="{Binding SelectorName}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> 我在这里做的事情: 覆盖选项卡行为以触发命令来选择另一个项目 将事件处理程序添加到选定的事件以聚焦文本框 命名文本框,以便可以找到并聚焦它 代码: private readonly ICommand _GoToNextItem = new Command((p) => { var lv = p as ListView; if (lv.SelectedIndex == -1 || lv.SelectedIndex == lv.Items.Count - 1) { lv.SelectedIndex = 0; } else { lv.SelectedIndex++; } }); public ICommand GoToNextItem { get { return _GoToNextItem; } } private readonly ICommand _GoToPreviousItem = new Command((p) => { var lv = p as ListView; if (lv.SelectedIndex <= 0) { lv.SelectedIndex = lv.Items.Count - 1; } else { lv.SelectedIndex--; } }); public ICommand GoToPreviousItem { get { return _GoToPreviousItem; } } private void ItemSelected(object sender, RoutedEventArgs e) { var item = sender as ListBoxItem; (FindNamedChild(item, "_tb") as TextBox).Focus(); } public static object FindNamedChild(DependencyObject container, string name) { if (container is FrameworkElement) { if ((container as FrameworkElement).Name == name) return container; } var ccount = VisualTreeHelper.GetChildrenCount(container); for (int i = 0; i < ccount; i++) { var child = VisualTreeHelper.GetChild(container, i); var target = FindNamedChild(child, name); if (target != null) { return target; } } return null; } 这是非常粗略的,使用其中任何部分的风险由您自行承担。 (我认为,在不将选择带入其中的情况下,对焦也可以采用不同的方式完成) (Command类只是ICommand的通用实现,它采用在接口的Execute方法中执行的lambda) 在 GridViewColumn 和单元格模板上设置 IsTabStop="False"。现在应该只选择 选项卡更改时数据模板内的文本框。 试试这个: <ListView DataContext="List" IsTabStop="False" > <ListView.View> <GridView> <GridViewColumn Header="Name" /> <GridViewColumn Header="Selector"> <GridViewColumn.CellTemplate> <DataTemplate > <TextBox Text="{Binding Name}" /> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView> 我来到这里是因为我有一个包含文本框的 UserControls ListView,并且我希望能够在列表中进行选项卡导航。这里的解决方案对我来说不起作用,但是,所做的只是将 ListView 更改为 ItemsControl。 UI 现在完全按照我的预期工作,并且根本不需要对代码进行任何更改。
错误处理方法:'ContentTemplate'和'ContentTemplateSelector'都设置了; “ContentTemplateSelector”将被忽略
我在 WPF 中创建了一个 DataGrid,其中包含带有模板化内容的组合框列(以使用某种颜色显示嵌入式组合框中的项目)。这是实际代码: 我在 WPF 中创建了一个 DataGrid,其中包含带有模板化内容的组合框列(以使用特定颜色显示嵌入式组合框中的项目)。这是实际代码: <DataGrid x:Name="WorkerTasksDataGrid" AutoGenerateColumns="False" HorizontalGridLinesBrush="DarkGray" VerticalGridLinesBrush="DarkGray" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="6" ItemsSource="{Binding Source={StaticResource persons}}" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="False"> <!-- https://stackoverflow.com/a/43044022/5128696 --> <DataGrid.Columns> <DataGridTextColumn Header="Start Date" Binding="{Binding Path=StartDate, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" IsReadOnly="True" /> <DataGridTextColumn Header="End Date" Binding="{Binding Path=EndDate, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" IsReadOnly="True" /> <!-- Here will be converter with parameter --> <!-- https://stackoverflow.com/questions/5702737/how-to-pass-specific-value-to-the-converter-parameter --> <DataGridTextColumn Header="Hours" Binding="{Binding Path=CalculatedTime}" IsReadOnly="True" /> <DataGridTextColumn Header="Project" Binding="{Binding Path=Project}" /> <DataGridTextColumn Header="Task" Binding="{Binding Path=Task}" /> <DataGridTextColumn Header="Remark" Binding="{Binding Path=Remark}" /> <!-- how to use combobox in table https://stackoverflow.com/a/4996663/5128696 --> <!-- how to style combobox items: https://stackoverflow.com/a/27963452/5128696 --> <DataGridComboBoxColumn Header="Target Company, Customer, Project" x:Name="TargetCompanyCol" SelectedItemBinding="{Binding Path=TargetCompanyColored}" ItemsSource="{Binding Source={x:Static local:WorkerAndTasksVM.ChooseCompanyItemsColored}}" DisplayMemberPath="displayName" > <DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <!-- 'Both ContentTemplate and ContentTemplateSelector are set' error happens when I click on Combobox https://stackoverflow.com/a/47416321/5128696 --> <Setter Property="ItemTemplate"> <Setter.Value> <DataTemplate> <Label Name="DT_ListLabel" Content="{Binding displayName}" Background="{Binding displayColor}" Margin="0"/> </DataTemplate> </Setter.Value> </Setter> </Style> </DataGridComboBoxColumn.EditingElementStyle> </DataGridComboBoxColumn> </DataGrid.Columns> <DataGrid.GroupStyle> <!-- that thing is complicated and not related to question --> </DataGrid.GroupStyle> </DataGrid> 当我单击组合框并展开项目列表时,会发生“ContentTemplate 和 ContentTemplateSelector 均已设置”错误。全文如下: System.Windows.Data 错误:25:“ContentTemplate”和“ContentTemplateSelector”均已设置; “ContentTemplateSelector”将被忽略。 ComboBoxItem:'ComboBoxItem' (名称='') 我没有在代码中指定ContentTemplateSelector! 它重复的次数等于组合框列表中的次数。我尝试在 DataTemplate (DT_ListLabel) 中的该标签内设置 ItemTemplateSelector="{x:Null}",就像我在这里看到的那样:https://stackoverflow.com/a/47416321/5128696 但它没有帮助(我没有树视图,但实际上是一个 DataGrid 和 Combobox)。用户可以在组合框中选择项目,也可以显示颜色,但我仍然收到这些错误。我该如何解决这个问题? 我设法让它发挥作用。显然,DisplayMemberPath 与 ItemTemplate 相矛盾。此问题与组合框(或任何其他控件)更相关,而不是与数据网格和组合框列相关。这个问题对我来说很有洞察力:https://stackoverflow.com/a/15656372。所以我删除了该声明。 <DataGridComboBoxColumn Header="Target Company, Customer, Project" x:Name="TargetCompanyCol" SelectedValueBinding="{Binding Path=TargetCompanyColored}" ItemsSource="{Binding Source={x:Static local:WorkerAndTasksVM.ChooseCompanyItemsColored}}" > <DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemTemplate"> <Setter.Value> <DataTemplate> <Label Name="DT_ListLabel" Content="{Binding displayName}" Background="{Binding displayColor}" Margin="0"/> </DataTemplate> </Setter.Value> </Setter> </Style> </DataGridComboBoxColumn.EditingElementStyle> </DataGridComboBoxColumn> 我还必须为保存 displayColor 和 displayName 的类定义 toString 方法
我有以下 ListView,我希望将其绑定到我的视图模型中的自定义列表: 我有以下 ListView,我希望将其绑定到我的视图模型中的自定义列表: <ListView x:Name="listviewPlayers" ItemsSource="{Binding Players}" Height="200"> <ListView.View> <GridView> <GridViewColumn Width="235"> <GridViewColumn.Header> <Label Grid.Column="2" Content ="Name" Foreground="Black" FontSize="10"></Label> </GridViewColumn.Header> </GridViewColumn> <GridViewColumn Width="235"> <GridViewColumn.Header> <Label Grid.Column="1" Content ="Score" Foreground="Black" FontSize="10"></Label> </GridViewColumn.Header> </GridViewColumn> <GridViewColumn Width="235"> <GridViewColumn.Header> <Label Grid.Column="0" Content ="Games" Foreground="Black" FontSize="10"></Label> </GridViewColumn.Header> </GridViewColumn> </GridView> </ListView.View> <ListView.ItemTemplate> <DataTemplate DataType="local:MainPageViewModel"> <Grid Height="25"> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Label Content="{Binding Name}" FontWeight="Bold" FontSize="10" Foreground="Black"> </Label> <Label Grid.Column="1" Content="{Binding CurrentScore}" FontSize="10" HorizontalContentAlignment="Center" Foreground="Black"> </Label> <Label Grid.Column="2" Content="{Binding GamesWon}" HorizontalContentAlignment="Center" FontSize="10" Foreground="Black"> </Label> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView> 在我的视图模型中我有玩家: public ObservableCollection<Player> Players { get { return players; } set { players = value; foreach (Player p in players) { PlayerNames.Add(p.Name); } PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Players")); } } 玩家看起来像这样: public class Player : INotifyPropertyChanged { public event PropertyChangedEventHandler? PropertyChanged; private string name = ""; public string Name { get { return name; } set { name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name")); } } private string currentScore = "0"; public string CurrentScore { get { return currentScore; } set { currentScore = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CurrentScore")); } } private string gamesWon = "0"; public string GamesWon { get { return gamesWon; } set { gamesWon = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("GamesWon")); } } 我的 ListView DataTemplate 绑定做错了什么?我已经在主窗口上设置了这个: d:DataContext="{d:DesignInstance Type=local:MainPageViewModel}" 此时 ListView 看起来像这样: 如有任何建议,我们将不胜感激。 谢谢, 迈克 您不得设置 ListView 的 ItemTemplate 属性。 改为设置 GridViewColumns 的 DisplayMemberBinding 属性。 <ListView x:Name="listviewPlayers" ItemsSource="{Binding Players}" Height="200"> <ListView.View> <GridView> <GridViewColumn Width="235" Header="Name" DisplayMemberBinding="{Binding Name}"/> <GridViewColumn Width="235" Header="Games" DisplayMemberBinding="{Binding CurrentScore}"/> <GridViewColumn Width="235" Header="Score" DisplayMemberBinding="{Binding GamesWon}"/> </GridView> </ListView.View> </ListView>
扩展器的切换按钮不同步。它的样式是这样的:关闭时,箭头指向右侧,打开时指向下方。 然而,当启动应用程序时,箭头指向右侧,但是
XAML WPF:从 DataTemplate DataTrigger 设置 AncestorType 的背景属性
我正在将WPF与ListView一起使用(我可以使用ListBox,问题仍然相同)。 我的 ListViewItem 具有自定义样式,模型具有 DataTemplate。我想改变...的背景颜色
所以我得到了ContentPage.Resources,我在其中为BindableLayout定义了DataTemplate。我需要将此 DataTemplate 中的 Unfocused 编辑器事件绑定到我的 ViewModel 中继命令。但我不能只是这样做...
我制作了一个数据模板,它将自动生成一些问题(从我的数据视图加载)。每个问题都有四个单选按钮,我将所有四个按钮分组到 GroupName 上。 我的问题是 - 如果我有 2...
如何使 WPF DataGrid 显示具有绑定和 DataTemplate 的 ViewModel 集合
我只是希望显示 DataGrid 内某种列表的内容。我目前正在尝试使用 ObservableCollection<> 和 DataGrid,但这可能会改变。我如何 DataTem...
我正在编写一个插件,该插件已加载到源不受我管理的应用程序中。通过 API,我可以获得应用程序的 AvalonDock DockingManager。我想添加一个绑定...