我正在使用以下WPF DataGrid + ComboBox方案来疯狂.
我有一组看起来像的课程;
class Owner
{
int ID { get; }
string Name { get; }
public override ToString()
{
return this.Name;
}
}
class House
{
int ID { get; }
Owner HouseOwner { get; set; }
}
class ViewModel
{
ObservableCollection<Owner> Owners;
ObservableCollection<House> Houses
}
Run Code Online (Sandbox Code Playgroud)
现在我想要的结果是一个DataGrid,它显示了House类型的行列表,在其中一列中,是一个ComboBox,它允许用户更改House.HouseOwner的值.
在这种情况下,网格的DataContext是ViewModel.Houses,对于ComboBox,我希望ItemsSource绑定到ViewModel.Owners.
这甚至可能吗?我正在努力解决这个问题...我能做的最好的事情就是正确地绑定ItemsSource,但是ComboBox(在DataGridTemplateColumn中)没有在每一行中显示House.HouseOwner的正确值.
注意:如果我将ComboBox从图片中取出并将TextBlock放入DataTemplate中,我可以正确地看到每行的值,但同时获取ItemsSource以及在选择中显示正确的值对我来说不起作用...
里面的背后我的代码,我已经设置窗口在DataContext到视图模型和对电网的DataContext设置ViewModel.Houses.对于除这个组合框之外的所有东西,它正在工作......
我的XAML对于违规列看起来像;
<DataGridTemplateColumn Header="HouseOwner">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=DataContext.Owners, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedItem="{Binding HouseOwner, RelativeSource={RelativeSource AncestorType={x:Type …Run Code Online (Sandbox Code Playgroud) 我尝试了几种方法来分解WPF DataGrid中的单元格格式(.NET 4提供的格式):
我将描述我的尝试,因为它可能会帮助其他人,我希望有人可以给我建议,以改善这些解决方案.请注意,我对WPF相当新...
预期的行为是将单元格字符串格式化为特定类似"1,234,567"的内容以进行显示,但在编辑单元格时应将其格式化为"1234567"(其默认格式).当我尝试使用数据转换器时,我没有找到在编辑时使用默认格式的方法,因此我将精力集中在样式和模板上.
使用样式,DataGridTextColumn的定义如下:
<DataGridTextColumn Header="Price (Style)" SortMemberPath="BILL_PRICE">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="{Binding Path=BILL_PRICE, StringFormat={}{0:N0}}"/>
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Text" Value="{Binding Path=BILL_PRICE}"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="BorderThickness" Value="0"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)
行为正是预期的.但是,由于绑定,我无法分解这种风格并多次使用它.为了解决分解问题,我使用了DataGridTemplateColumn和数据模板.这是我的DataGridTemplateColumn定义:
<DataGridTemplateColumn Header="Price (Template)" SortMemberPath="BILL_PRICE">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding BILL_PRICE}" Template="{StaticResource CurrencyCellControlTemplate}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ContentControl Content="{Binding BILL_PRICE, Mode=TwoWay}" Template="{StaticResource CurrencyCellEditingControlTemplate}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
和ControlTemplate定义:
<ControlTemplate x:Key="CurrencyCellControlTemplate" TargetType="ContentControl">
<TextBlock Margin="2,0,2,0" Padding="0" TextAlignment="Right">
<TextBlock.Text>
<Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Content" StringFormat="{}{0:N0}"/> …Run Code Online (Sandbox Code Playgroud) wpf datagrid string-formatting datagridtemplatecolumn datagridtextcolumn
要关注我之前的帖子=> 在DataGrid中使用不同类型绑定ComboBox的SelectedItem
我现在有一个包含2列的数据网格,一个带有文本,另一个带有组合框(在数据模板中,通过C#代码编写,而不是Xaml).
在对组合框做了一些选择之后,我现在想解析结果,但是包含我的组合框的单元格的值保持为空:
foreach(DataRowView row in Datagrid1.Items)
{
var firstColumNresult = row.Row.ItemArray[0];// Return correctly a string
var myrow = row.Row.ItemArray[1];// always empty...
}
Run Code Online (Sandbox Code Playgroud)
结果是我无法获得我(之前生成的)组合框的值.
我想一个绑定必须错过某个地方......
这是组合框创建代码:
DataTable tableForDG = new DataTable();
tableForDG.Columns.Add(new DataColumn { ColumnName = "Name", Caption = "Name" });
tableForDG.Columns.Add(new DataColumn { ColumnName = "Attachment", Caption = "Attachment" }); // this column will be replaced
tableForDG.Columns.Add(new DataColumn { ColumnName = "AttachmentValue", Caption = "AttachmentValue" });
tableForDG.Columns.Add(new DataColumn { ColumnName = "DisplayCombo", Caption = "DisplayCombo", DataType=bool });
// …Run Code Online (Sandbox Code Playgroud) 我正在尝试自定义DataGrid的列标题以显示子列标题,如以下屏幕截图所示:
alt text http://img297.imageshack.us/img297/464/columnheaders.gif
我为2个子列创建了一个样式,如下面的XAML所示:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data"
xmlns:sl="clr-namespace:UI" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="UI.ColumnHeaderGrid"
mc:Ignorable="d">
<UserControl.Resources>
<Style x:Key="SplitColumnHeaderStyle" TargetType="primitives:DataGridColumnHeader">
<Setter Property="Foreground" Value="#FF000000"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="SeparatorBrush" Value="#FFC9CACA"/>
<Setter Property="Padding" Value="4"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="primitives:DataGridColumnHeader">
<Grid x:Name="Root">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Rectangle x:Name="BackgroundRectangle" Fill="#FF1F3B53" Stretch="Fill" Grid.ColumnSpan="2"/>
<Rectangle x:Name="BackgroundGradient" Stretch="Fill" Grid.ColumnSpan="2">
<Rectangle.Fill>
<LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
<GradientStop Color="#FCFFFFFF" Offset="0.015"/>
<GradientStop Color="#F7FFFFFF" Offset="0.375"/>
<GradientStop Color="#E5FFFFFF" Offset="0.6"/>
<GradientStop Color="#D1FFFFFF" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/> …Run Code Online (Sandbox Code Playgroud) 我有"首选项"数据结构,其中我有字符串"值"字段和"类型"字段的枚举.
类型可以是0-Boolean,1-Integer,2-String ...
根据此类型字段中的值,我想以不同的方式显示"值"单元格复选框,文本框,下拉列表等.因此,要清楚 - 相同的列应根据该行中的数据显示不同的单元格.
我想我需要使用DataGridTemplateColumn,但我从来没有这样做过,如果可能的话,我想要一些例子.
另外,我可以用XAML做什么以及在Code中需要做什么?我想也必须使用Value转换器?
当我双击 - 或者当它已经聚焦时单击一次 - 在我的DataGridTemplateColumn中的Listbox的空白区域中的项目下面时,我得到上面的错误消息.
我错了什么?
这是我的代码:
<DataGridTemplateColumn Width="0.3*" Header="Attachments">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<Button>Add</Button>
<Button>Delete</Button>
<ListBox Name="itemListBox" BorderThickness="0" ItemsSource="{Binding Attachments}" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Margin="5">
<TextBlock Text="{Binding DocumentFilename}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
关于我点击"myPhotos.png"项目条目下方的图片: alt text http://666kb.com/i/bh6lbd47okwancfel.png
编辑:这个错误也已经在XAML中通过工具提示可见,只是没有看到错误工具提示......
嗨,我有一个datagrid,它有许多datagridtemplate列,除了它们在模板的stackpanel上都有不同的datacontext之外,它们都是相同的.
<toolkit:DataGridTemplateColumn Header="Col 1">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel DataContext="{Binding Times[0]}">
<!-- the structure that I want to extract to a template -->
</StackPanel>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
<toolkit:DataGridTemplateColumn Header="Col 2">
<toolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel DataContext="{Binding Times[1]}">
<!-- the same structure here -->
</StackPanel>
</DataTemplate>
</toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
我想让每一列使用一个特定的itemtemplate(就像我已经完成了一个列表框),但似乎看不出如何,除非我遗漏了一些东西.
在WPF的DataGrid控件中,如果将列设置为其中一个默认列类型(如DataGridTextColumn或DataGridCheckBoxColumn),对该列进行排序,然后更改其值,网格将自动重新排序.
但是,如果使用DataGridTemplateColumn(并允许对列进行排序),则可以对其进行排序,但更改此列中单元格的值不会导致网格未重新排序.我如何诱导它自动触发重新排序?
XAML:
<DataGrid Name="grid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="First name" Binding="{Binding First}"/>
<DataGridTemplateColumn Header="Last name" SortMemberPath="Last">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Last}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>Run Code Online (Sandbox Code Playgroud)
捆绑:
ObservableCollection items = new ObservableCollection();
grid.ItemsSource = items;
items.Add(new Character() { First = "Homer", Last = "Simpson" });
items.Add(new Character() { First = "Kent", Last = "Brockman" });
items.Add(new Character() { First = "Montgomery", Last = "Burns" });Run Code Online (Sandbox Code Playgroud)
这是我的项目类,以防万一相关:
public class Character : INotifyPropertyChanged {
private string first, last;
public event PropertyChangedEventHandler …Run Code Online (Sandbox Code Playgroud) 我有一个DataGridTemplateColumn.在它里面CellEditingTemplate,我放了一个DatePicker控件.现在,如果我想编辑日期,我必须单击三次才能DatePicker开始编辑.有人可以告诉我如何DatePicker只需点击两下就可以进入编辑模式吗?此外,如果DataGridTemplateColumn集中注意力,键盘输入也不会DatePicker进入编辑模式.如果它也可以修复它会很好.