- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个数据网格,在列标题中使用过滤器。它有效,但我认为这不是一个好方法。让我向您展示代码,非常简单的示例:
View
<Window x:Class="TestDataGridApp.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="clr-namespace:TestDataGridApp.ViewModels"
mc:Ignorable="d"
Title="MainWindow" Height="300" Width="300">
<Window.DataContext>
<viewModels:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
<DataTemplate x:Key="DataGridHeader">
<DockPanel>
<TextBlock DockPanel.Dock="Top" TextAlignment="Left" Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
<TextBox DockPanel.Dock="Top" Text="{Binding DataContext.FilterName, RelativeSource={RelativeSource AncestorType=Window}, UpdateSourceTrigger=LostFocus}"/>
</DockPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{Binding ItemCollection}" AutoGenerateColumns="False">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding Path=Id}" Width="60" MinWidth="60" MaxWidth="60" HeaderTemplate="{StaticResource DataGridHeader}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="60" MinWidth="60" MaxWidth="60" HeaderTemplate="{StaticResource DataGridHeader}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
View 模型
namespace TestDataGridApp.ViewModels
{
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Data;
using TestDataGridApp.Entities;
using Prism.Mvvm;
public class MainWindowViewModel : BindableBase
{
private string _filterId;
private string _filterName;
private ObservableCollection<Item> _items = new ObservableCollection<Item>();
public MainWindowViewModel()
{
for (int i = 1; i <= 100; ++i)
{
Items.Add(new Item() {Id = i, Name = $"Item{i}"});
}
}
public string FilterId
{
get { return _filterId; }
set
{
SetProperty(ref _filterId, value);
TriggerFilters();
}
}
public string FilterName
{
get { return _filterName; }
set
{
SetProperty(ref _filterName, value);
TriggerFilters();
}
}
public ObservableCollection<Item> Items
{
get { return _items; }
set { SetProperty(ref _items, value); }
}
public ICollectionView ItemCollection => CollectionViewSource.GetDefaultView(Items);
private void TriggerFilters()
{
ItemCollection.Filter = o => FilterItem((Item)o);
}
private bool FilterItem(Item item)
{
try
{
bool checkId = false;
bool checkName = false;
int itemId = 0;
if (!string.IsNullOrEmpty(FilterId) && int.TryParse(FilterId, out itemId)) checkId = true;
if (!string.IsNullOrEmpty(FilterName)) checkName = true;
if (!checkId && !checkName) return true;
if (item == null) return false;
bool checkIdIsOk = (checkId && item.Id == int.Parse(FilterId) || !checkId);
bool checkNameIsOk = (checkName && item.Name.ToUpper().Contains(FilterName.ToUpper()) || !checkName);
if (checkIdIsOk && checkNameIsOk) return true;
}
catch (Exception e)
{
Console.WriteLine(e);
}
return false;
}
}
}
项目
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
基本简单的数据网格,2 列。在每一列中都有一个 TextBox
带绑定(bind)过滤器。每个过滤器都有自己的字段,所以在失去焦点后,我可以通过所有过滤器过滤网格。
我的问题是..我有很多专栏。这是定制的数据网格,因此您可以即时添加和删除列,并且有很多重复代码。基本上这是重复的:
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<DockPanel>
<TextBlock DockPanel.Dock="Top" TextAlignment="Left" Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
<TextBox DockPanel.Dock="Top"
Text="{Binding DataContext.FilterId, RelativeSource={RelativeSource AncestorType=Window}, UpdateSourceTrigger=LostFocus}"/>
</DockPanel>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
... 只有这个 <TextBox DockPanel.Dock="Top" Text="{Binding DataContext.FilterId, ...
正在针对不同的列进行更改。
所以,我想,我可以很容易地用这个解决方案替换它,但是现在..我失去了对 ViewModel 中我的过滤器字段的绑定(bind):
<Window.Resources>
<DataTemplate x:Key="DataGridHeader">
<DockPanel>
<TextBlock DockPanel.Dock="Top" TextAlignment="Left" Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
<TextBox DockPanel.Dock="Top" Text="{Binding DataContext.FilterName, RelativeSource={RelativeSource AncestorType=Window}, UpdateSourceTrigger=LostFocus}"/>
</DockPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{Binding ItemCollection}" AutoGenerateColumns="False">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding Path=Id}" Width="60" MinWidth="60" MaxWidth="60" HeaderTemplate="{StaticResource DataGridHeader}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="60" MinWidth="60" MaxWidth="60" HeaderTemplate="{StaticResource DataGridHeader}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
SOO.. 我在想,创建一个Dictionary
对于过滤器,其中 key 是列的名称,在 value 中我将存储当前过滤器(或者 null,如果此时此列没有过滤器)。像..
<TextBox x:Name="Foo" DockPanel.Dock="Top" Text="{Binding DataContext.FiltersDictionary[Foo], RelativeSource={RelativeSource AncestorType=Window}, UpdateSourceTrigger=LostFocus}"/>
但是我必须为一个 TextBox 投标上下文。我真的不确定这个解决方案..
我的问题是,如何在上述场景中为 DataTemplate 创建参数?
感谢您的帮助!
附言。这不是重复的。这个问题是关于“如何为 DataTemplate 创建参数”。 “重复”问题是关于字典作为绑定(bind)的——这个问题的潜在解决方案……虽然可能不是。正如另一位用户所建议的那样,可能有完全不同的更好的解决方案来解决这个问题。两种不同的东西。我很震惊,我必须解释这个
最佳答案
最简单的方法是不要只依赖 xaml 并添加一些代码来提供帮助。例如,像这样使用 TextBox
的 Loaded
事件:
<DataTemplate x:Key="DataGridHeader">
<DockPanel>
<TextBlock DockPanel.Dock="Top" TextAlignment="Left" Text="{Binding Content, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
<TextBox DockPanel.Dock="Top" Loaded="OnFilterBoxLoaded" />
</DockPanel>
</DataTemplate>
并在加载时设置绑定(bind):
private void OnFilterBoxLoaded(object sender, RoutedEventArgs e) {
var tb = (TextBox)sender;
// find column
DataGridColumnHeader parent = null;
DependencyObject current = tb;
do {
current = VisualTreeHelper.GetParent(current);
parent = current as DataGridColumnHeader;
}
while (parent == null);
// setup binding
var binding = new Binding();
// use parent column header as name of the filter property
binding.Path = new PropertyPath("DataContext.Filter" + parent.Column.Header);
binding.Source = this;
binding.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus;
tb.SetBinding(TextBox.TextProperty, binding);
}
您可以使用附加属性来实现相同的目的,但我认为在这种情况下不需要它。
关于c# - Window.Resources 中的 WPF DataTemplate 绑定(bind)参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43006104/
我正在使用 DataTemplate 将 View 应用于 ViewModel。我有一种情况,当 View 的一个实例(DataTemplate)中发生某件事时,我需要在所有其他实例中采取行动。 我已
如何从 DataTemplate 派生新类,然后用它代替 DataTemplate? 例如,在 C# 中: public class DerivedDataTemplate : DataTemplat
我有以下xaml; 当我使用 Node 模板显示 No
我想在 dataTemplate 中使用 dataTemplale。我想像这样在列表框中显示数据: 这就是我得到的。它不起作用。 cl
大家好,我正在尝试更改 dataGrid 中列的模板,但我找不到在 XAML 中执行此操作的方法。我正在尝试通过这种方式来做
wpf 应用程序中的默认 DataTemplate 显示 .ToString() 方法的结果。我正在开发一个默认 DataTemplate 不显示任何内容的应用程序。 我试过:
我发现自己有点束手无策……有束缚……呵呵……(跛脚) 无论如何...我需要引用主 ViewModel 的属性,但来自 DataTemplate ,它本身在另一个 DataTemplate 中... 看
我已经为我喜欢的项目中的一些数据类型创建了几个数据模板。这些数据模板真的很酷,因为它们像魔术一样工作,无论何时何地出现在 UI 中,都神奇地改变了数据类型实例的外观。现在我希望能够在一个特定的列表框中
这个问题在这里已经有了答案: 11年前关闭。 Possible Duplicate: Datatemplate inheritance 我有几个不是子类的数据类型,它们也不共享一个接口(interfa
我有一个用代码隐藏在 XAML 中定义的 ResouceDictionary。我需要使用鼠标事件和数据绑定(bind)定义一些特定于 View 的行为,为此我需要访问在 DataTemplate 中定
我有一个用代码隐藏在 XAML 中定义的 ResouceDictionary。我需要使用鼠标事件和数据绑定(bind)定义一些特定于 View 的行为,为此我需要访问在 DataTemplate 中定
我创建了一个 DataTemplateSelector,它使用一组已知接口(interface)进行初始化。如果传递到选择器的项目实现了这些接口(interface)之一,则返回关联的数据模板。 首先
是否可以将数据模板用于没有 ListBox 或其他项目控件的单个项目? 我有一个数据模板,我想在 xaml 中实例化,而不是在列表中,只是在边框内,并设置其数据上下文。 类似(伪):
在我的 MainWindow.xaml 中,我对 ResourceDictionary 有以下引用: 在 Main
我在数据模板中有 WPF ComboBox(列表框中有很多组合框),我想处理输入按钮。如果它是例如,那将很容易。一个按钮 - 我会使用命令 + 相对绑定(bind)路径等。不幸的是,我不知道如何使用命
我想对 ItemsCollection 进行数据绑定(bind),但不是渲染集合项,而是渲染通过集合项上的属性到达的子对象。 更具体地说:这将是游戏的 2D map 查看器(尽管在当前状态下它还不是
我使用 MasterDetailsView控制。它有 MasterHeaderTemplate属性(property)。我想添加一个 TextBox以便执行元素搜索。我不明白该怎么做。因为DataTe
我为自己设计的一个非常基本的 WPF 练习遇到了一个奇怪的问题,即从 ViewModel 动态填充菜单。给定以下主窗口标记:
在设计新的 WPF 应用程序时,我注意到在使用 DataTemplates 对控件进行数据绑定(bind)期间不会抛出异常。为了测试,我用尽可能少的逻辑编写了以下简单的用户控件。我正在使用在 WIN7
我有一个关于 this one 的问题:我正在尝试将一个事件附加到我的 StackPanel,但在使用 XamlReader 时它似乎没有连接。我无法调用 ChildItem_Load 方法。有谁知道
我是一名优秀的程序员,十分优秀!