标签: datagridtemplatecolumn

带有ComboBox绑定的WPF DataGridTemplateColumn(MVVM模式)

我正在使用以下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 binding datagrid combobox datagridtemplatecolumn

11
推荐指数
2
解决办法
3万
查看次数

WPF DataGrid单元格字符串格式作为样式或模板

我尝试了几种方法来分解WPF DataGrid中的单元格格式(.NET 4提供的格式):

  • 一个数据转换器,
  • 样式中的"StringFormat"绑定属性,
  • 数据模板中的"StringFormat"绑定属性.

我将描述我的尝试,因为它可能会帮助其他人,我希望有人可以给我建议,以改善这些解决方案.请注意,我对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

8
推荐指数
1
解决办法
1万
查看次数

如何在wpf的数据网格中获得以编程方式编写的组合框的值?

要关注我之前的帖子=> 在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)

c# xaml datagrid parsing datagridtemplatecolumn

8
推荐指数
1
解决办法
243
查看次数

如何自定义和重用DataGridColumnHeader样式?

我正在尝试自定义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)

c# silverlight contentpresenter datagridtemplatecolumn

7
推荐指数
1
解决办法
9454
查看次数

WPF DataGrid如何根据绑定数据将ColumnType设置为不同的类型?

我有"首选项"数据结构,其中我有字符串"值"字段和"类型"字段的枚举.

类型可以是0-Boolean,1-Integer,2-String ...

根据此类型字段中的值,我想以不同的方式显示"值"单元格复选框,文本框,下拉列表等.因此,要清楚 - 相同的列应根据该行中的数据显示不同的单元格.

我想我需要使用DataGridTemplateColumn,但我从来没有这样做过,如果可能的话,我想要一些例子.

另外,我可以用XAML做什么以及在Code中需要做什么?我想也必须使用Value转换器?

c# wpf binding datagridtemplatecolumn

7
推荐指数
1
解决办法
4982
查看次数

如何访问datagrid模板列文本框文本WPF C#

我需要DataGrid从后面的代码访问模板列中的文本,但我不知道如何.我需要将文本更改为我在SelectionChanged事件中传递给它的任何字符串.有人可以告诉我如何实现这一目标吗?我在这里发现了一个类似的问题, 但它没有答案.

wpf datagrid wpfdatagrid datagridtemplatecolumn

7
推荐指数
1
解决办法
2万
查看次数

WPF:System.ArgumentException => {"'{0}'不是Visual或Visual3D."}

当我双击 - 或者当它已经聚焦时单击一次 - 在我的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中通过工具提示可见,只是没有看到错误工具提示......

wpf listbox exception datagridtemplatecolumn

6
推荐指数
2
解决办法
4088
查看次数

WPF DataGridTemplateColumn共享模板?

嗨,我有一个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 datagridtemplatecolumn

6
推荐指数
1
解决办法
3110
查看次数

WPF DataGrid:自动对DataGridTemplateColumn进行重新排序

在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)

c# wpf datagrid datagridtemplatecolumn

6
推荐指数
1
解决办法
2万
查看次数

带有DatePicker的DataGridTemplateColumn需要三次单击才能编辑日期

我有一个DataGridTemplateColumn.在它里面CellEditingTemplate,我放了一个DatePicker控件.现在,如果我想编辑日期,我必须单击三次才能DatePicker开始编辑.有人可以告诉我如何DatePicker只需点击两下就可以进入编辑模式吗?此外,如果DataGridTemplateColumn集中注意力,键盘输入也不会DatePicker进入编辑模式.如果它也可以修复它会很好.

wpf wpfdatagrid datagridtemplatecolumn

5
推荐指数
1
解决办法
4257
查看次数