使一组DataGrid列具有比例宽度的最佳/正确方法是什么(Width="\*"),但是它们的最小宽度至少是其内容的宽度?目前,如果我使用Width="*",那么列保持完全成比例,但内容如果列太薄,会被裁剪.如果我使用Width="Auto",那么列的大小完全符合它们的内容,但这使它们具有不同的大小.
我想要的实际上是两者的组合,例如Width="\*",MinWidth="Auto"当有额外的宽度时,列将全部空出到相等的宽度,但是当网格变小时,内容永远不会被裁剪.
可悲的是,MinWidth="Auto"不存在,所以我想我需要绑定列的MinWidth属性,但很难弄清楚我将它绑定到什么.
如何告诉WPF "MinWidth="列的最宽内容的宽度?
我在ResourceDictionary中设置了一个SolidColorBrush和LinearGradientBrush资源.我使用这些,因为我重新设计了几个控件,用于我们的应用程序.
现在我有一堆其他外部画笔,我必须使用它们来改变我们的应用程序.这些也在ReseourceDictionary中设置.
是否可以将我的画笔资源指向另一个字典中的新资源,类似于样式的"BasedOn"属性?
这样的事情,概念上至少:
<SolidColorBrush x:Key="MyDataGridHeaderBrush" Binding="HeaderBrushDefinedElsewhere"/>
Run Code Online (Sandbox Code Playgroud)
...或者这种事情是不可能的,在这种情况下我只需要进行查找/替换并用新的刷子名称替换所有刷子名称?
提前致谢,
在
我试图获取与特定关联的属性的名称DataGridColumn,以便我可以基于此做一些事情.当用户单击列标题上的上下文菜单项时,将调用此函数...
对于开箱即用的现成滚动列类型来说这很好DataGridTextColumn,因为它们是绑定的,但问题是我的一些列DataGridTemplateColumns是未绑定的.
private void GroupByField_Click (object sender, RoutedEventArgs e){
MenuItem mi = (MenuItem)sender;
ContextMenu cm = (ContextMenu) mi.Parent;
DataGridColumnHeader dgch = (DataGridColumnHeader) cm.PlacementTarget;
DataGridBoundColumn dgbc = (DataGridBoundColumn) dgch.Column;
Binding binding = (Binding) dgbc.Binding;
string BoundPropName = binding.Path.Path;
//Do stuff based on bound property name here...
}
Run Code Online (Sandbox Code Playgroud)
所以,以我的Name专栏为例......它是一个DataGridTemplateColumn(因为它有一个图像和其他一些东西).因此,它实际上并没有绑定到'Name'属性...但我希望如此,以便上面的代码可以工作.
我的问题是两部分的,真的:
是否有可能成为一个DataGridTemplateColumnBOUND,以便上述代码可以工作?我能以某种方式将它绑定到一个属性吗?
或者我需要完全不同的东西,并更改上面的代码?
提前致谢!
在
好吧,这是一个令人尴尬的简单问题,但让我发疯.我正在学习DataTemplating,并且我正在尝试将非常简单的ItemTemplate应用于ListBox.
但是,当我运行我的应用程序时,模板完全被忽略,我只是得到标准的列表框,而实际上我希望看到一个带有'Test'的复选框列表.
我已经尝试过几次并且总是一样的结果.我在Google上查了几个资源,并且在ListBox上都有相同的语法定义和ItemTemplate,所以我真的看不出我出错的地方.
码...
<Grid x:Name="LayoutRoot">
<ListBox x:Name="TestList"
SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<CheckBox Content="Check this checkbox!"/>
<TextBlock>Test</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.Items>
<ListBoxItem>Bob</ListBoxItem>
<ListBoxItem>Jim</ListBoxItem>
<ListBoxItem>Dave</ListBoxItem>
<ListBoxItem>Larry</ListBoxItem>
<ListBoxItem>Tom</ListBoxItem>
</ListBox.Items>
</ListBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢.抱歉这样一个看似愚蠢的问题,但我真的堕落在这里的第一个障碍:(
在
我是一个WPF菜鸟,所以请放轻松我;-)
我正在尝试创建一个分组的DataGrid(WPF工具包版本).我已经成功创建了数据源,DataGrid本身,所需的CollectionViewSource和组头的样式(使用扩展器).
我想通过名为"Assign_To"的属性进行分组,并在标题中显示相关值(分组项共享的值).但是,我无法弄清楚如何绑定到当前组/项以返回其Assign_To属性.
我得到的最接近的(如下所示)绑定到整个CollectionViewSource,它返回Assign_To的固定值.绑定到当前项/组以便为"Assign_To"返回正确值的正确方法是什么?
希望有人能提供帮助.谢谢!
安迪T.
这是源头......
<Window DataContext="{Binding Source={StaticResource SampleDataSource}}"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="DataGridTest.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480" mc:Ignorable="d">
<Window.Resources>
<CollectionViewSource x:Key="CVS" Source="{Binding MyData}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Assign_To"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Assign To: "/>
<TextBlock Text="{Binding Source={StaticResource CVS}, Path=Assign_To}"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid x:Name="LayoutRoot">
<dg:DataGrid
ItemsSource="{Binding Source={StaticResource CVS}}"
SelectionUnit="CellOrRowHeader"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="False">
<dg:DataGrid.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
<GroupStyle.Panel> …Run Code Online (Sandbox Code Playgroud) 好的,这是一个超级超级菜鸟问题,我几乎不好意思问...
我想在我的XAML文件中引用一个类.它是一个DataTemplateSelector,用于为DataGrid列选择正确的编辑模板.
无论如何,我已经将类编写到我的代码后面,将本地命名空间添加到XAML顶部的顶部,但是当我尝试从XAML引用该类时,它告诉我该类在本地命名空间中不存在.我必须遗漏一些非常简单但我无法理解的东西......
这是我的代码.
XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit"
xmlns:local="clr-namespace:CustomFields"
xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
x:Class="CustomFields.MainWindow"
x:Name="Window"
Title="Define Custom Fields"
Width="425" Height="400" MinWidth="425" MinHeight="400">
<Window.Resources>
<ResourceDictionary>
<local:RangeValuesEditTemplateSelector>
blah blah blah...
</local:RangeValuesEditTemplateSelector>
</ResourceDictionary>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
C#:
namespace CustomFields
{
public partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
// Insert code required on object creation below this point.
}
}
public class RangeValuesEditTemplateSelector : DataTemplateSelector
{
public RangeValuesEditTemplateSelector(){
MessageBox.Show("hello");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有什么想法我做错了吗?我认为这应该很简单,如1-2-3 ......
谢谢!
我正在使用WPFToolkit DataGrid控件,我想重新设置一些列标题,以便标题文本垂直显示而不是水平显示(列中的数据都是数字,因此,不是很宽,但标题文本是长).所以我创建了一个DataTemplate并尝试将DataGridColumn.HeaderTemplate添加到它.这是我的模板:
<DataTemplate x:Key="headerTemplate">
<StackPanel VerticalAlignment="Bottom" HorizontalAlignment="Left" Background="Aqua">
<StackPanel.LayoutTransform>
<RotateTransform Angle="-90"/>
</StackPanel.LayoutTransform>
<TextBlock Text="{Binding}" VerticalAlignment="Bottom" HorizontalAlignment="Left" Background="Pink">
</TextBlock>
</StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
这很好用,除了标题的对齐总是左和中.StackPanel或TextBlock的对齐组合似乎没有任何区别.我希望文本在底部和中间对齐.我该怎么做呢?
谢谢,
在
我在WPF中创建了一个ListBox样式,以便它呈现为一个复选框列表.
当我手动填充ListBox的项目时,样式工作完美.但是,当我将ListBox的ItemsSource绑定到静态资源(包含所需项目的ItemsControl)时,样式将被完全删除.
这是风格:
<Style x:Key="CheckBoxListStyle" TargetType="ListBox">
<Style.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Grid Margin="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<CheckBox IsChecked="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
<ContentPresenter
Grid.Column="1"
Margin="2,0,0,0" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Style.Resources>
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Background" Value="Transparent" />
</Style>
Run Code Online (Sandbox Code Playgroud)
这是ListBox的代码,它正确显示了样式:
<ListBox x:Name="ColumnsList"
Grid.Column="0"
Grid.Row="0"
Style="{StaticResource CheckBoxListStyle}"
BorderThickness="1">
<ListBox.Items>
<ListBoxItem>Test</ListBoxItem>
<ListBoxItem>Test2</ListBoxItem>
<ListBoxItem>Test3</ListBoxItem>
</ListBox.Items>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
这是ListBox忽略样式的代码:
<ListBox x:Name="ColumnsList2"
Grid.Column="0"
Grid.Row="0"
Style="{StaticResource CheckBoxListStyle}"
BorderThickness="1" …Run Code Online (Sandbox Code Playgroud) wpf ×8
xaml ×5
datagrid ×4
binding ×2
c# ×2
class ×1
datatemplate ×1
grouping ×1
itemtemplate ×1
layout ×1
listbox ×1
listboxitem ×1
resources ×1
styles ×1
styling ×1
width ×1
wpfdatagrid ×1