标签: wpfdatagrid

WPF DataGrid:重新排序行?

我正在创建一个WPF数据网格,我希望能够通过拖放重新排序行,如下所示:我单击一行并向上或向下拖动它.像我一样,如果我释放鼠标,标记会显示行将被丢弃的位置.当我释放鼠标时,拖动的行将插入标记指示的位置.

有没有人看到任何文章或博客文章,说明如何做到这一点?如果我不需要,我不想重新发明轮子,谷歌也没有发现任何东西.谢谢.

.net wpf datagrid drag-and-drop wpfdatagrid

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

WPF数据网格粘贴

我在从csv粘贴到wpf数据网格时遇到了麻烦 - 我已经按照这里的建议进行了操作

http://blogs.msdn.com/b/vinsibal/archive/2008/09/25/pasting-content-to-new-rows-on-the-wpf-datagrid.aspx

并且代码exectues没有问题 - 但是,似乎创建了所有新行,但只有第一行填充了数据.数据似乎不断被覆盖,以便剪贴板数据中的最后一项填充在第一行,所有其他行都是空白.我知道这一定是一个索引问题,但我无法追踪它.

此外,当我查看网格的可绑定集合中的对象时,它们都没有任何数据.在列的OnPastingCellClipboardContent中是否存在某些错误(也许是数据转换)?

任何想法(见下面的代码)

protected virtual void OnExecutedPaste(object sender, ExecutedRoutedEventArgs args)
    {
        // parse the clipboard data
        List<string[]> rowData = ClipboardHelper.ParseClipboardData();
        bool hasAddedNewRow = false;

        // call OnPastingCellClipboardContent for each cell
        int minRowIndex = Math.Max(Items.IndexOf(CurrentItem), 0);
        int maxRowIndex = Items.Count - 1;
        int minColumnDisplayIndex = (SelectionUnit != DataGridSelectionUnit.FullRow) ? Columns.IndexOf(CurrentColumn) : 0;
        int maxColumnDisplayIndex = Columns.Count - 1;

        int rowDataIndex = 0;
        for (int i = minRowIndex; i <= maxRowIndex && rowDataIndex < rowData.Count; i++, …
Run Code Online (Sandbox Code Playgroud)

wpf wpf-controls wpfdatagrid

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

如何将焦点设置为WPF工具包datagrid的特定单元格

我正在使用WPF工具包提供的DataGrid控件来显示产品列表及其OpenStock,Description等.在这个DataGrid中,我将OpenStock列设置为editable,rest是不可编辑的.我现在想要的是当我加载这个窗口时,我想将键盘焦点设置到OpenStock列的第一个单元格,如果可能的话,在编辑模式下.我搜索了这个2天,最后发布在这里.

任何帮助或代码示例都会有所帮助.

<my:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" Margin="2,2,2,55" 
x:Name="dataGrid1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="White"    
AlternatingRowBackground="AliceBlue" AlternationCount="2" SelectionMode="Single" 
SelectionUnit="Cell" BorderThickness="0" IsTabStop="True">
        <my:DataGrid.Resources>
            <Style x:Key="errorStyle" TargetType="{x:Type TextBox}">
                <Setter Property="Padding" Value="-2"/>
                <Style.Triggers>
                    <Trigger Property="Validation.HasError" Value="True">
                        <Setter Property="Background" Value="Yellow"/>
                        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
                                Path=(Validation.Errors)[0].ErrorContent}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </my:DataGrid.Resources>
        <my:DataGrid.Columns>
            <my:DataGridTextColumn Width="60" FocusManager.IsFocusScope="False" Binding="{Binding Path=pCode}" Header="Code" IsReadOnly="True" />
            <my:DataGridTextColumn Width="150" Binding="{Binding pName}" Header="Description"  IsReadOnly="True" />
            <my:DataGridTextColumn Width="120" Binding="{Binding CloseStock}" Header="Closing Stock"  IsReadOnly="True" />
            <my:DataGridTextColumn  Width="100" Binding="{Binding OpenStock, ValidatesOnExceptions=True}" Header="Open Stock"
                                   EditingElementStyle="{StaticResource errorStyle}"/>
            <my:DataGridTextColumn Width="150" Binding="{Binding YrlyOpenStock}" Header="Yearly Opening" …
Run Code Online (Sandbox Code Playgroud)

c# wpf wpfdatagrid

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

DataGrid RowDetails宽度问题

假设我有一个像这样定义的DataGrid

<DataGrid AreRowDetailsFrozen="True"
          ItemsSource="{Binding MyCollection}"
          AutoGenerateColumns="False">
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <Border CornerRadius="5" BorderBrush="Red"
                    BorderThickness="2" Background="Black">
                <TextBlock Foreground="White" Text="{Binding RowDetails}"
                           TextWrapping="Wrap"/>
            </Border>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
    <DataGrid.Columns>
        <DataGridTextColumn Header="0" Binding="{Binding Value1}"/>
        <DataGridTextColumn Header="1" Binding="{Binding Value2}"/>
        <DataGridTextColumn Header="2" Binding="{Binding Value3}"/>
        <DataGridTextColumn Header="3" Binding="{Binding Value4}"/>
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

在有和没有RowDetails的情况下看起来像这样

替代文字

在右边的图片中,我得到了一个永不包裹的非常长的DataGridRow.
是否可以让RowDetails使用与DataGrid相同的宽度而不影响Width本身?

我尝试过的东西实现了包装但不是令人满意的方式

  • 在Border或TextBlock上设置Width或MaxWidth.不是很有活力.
  • 在DataGrid上设置ScrollViewer.Horizo​​ntalScrollBarVisibility ="Disabled".当柱子不适合时不太好.

wpf datagrid wpfdatagrid rowdetails

13
推荐指数
3
解决办法
8201
查看次数

将上下文菜单命令参数绑定到datagrid属性

在我的XAML文件中,我有一个带有上下文菜单的DataGrid.数据源是一个ViewModel,它有一个属性EntityCollection(一个ObservableCollection)作为DataGrid的ItemsSource,另一个集合ContextMenu.MenuItems作为数据源在DataGrid上创建一个上下文菜单.该集合的元素有一个Command属性,我绑定到菜单项的Command属性:

<DataGrid Name="EntityDataGrid" ItemsSource="{Binding EntityCollection}" Height="450">
  <DataGrid.ContextMenu>
    <ContextMenu ItemsSource="{Binding Path=ContextMenu.MenuItems}">
      <ContextMenu.ItemContainerStyle>
        <Style TargetType="{x:Type MenuItem}">
          <Setter Property="Command" Value="{Binding Command}" />
          <Setter Property="CommandParameter"
                  Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" />
        </Style>
      </ContextMenu.ItemContainerStyle>
    </ContextMenu>
  </DataGrid.ContextMenu>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

菜单项命令的操作在ViewModel中具有以下签名:

private void SelectedItemsAction(object parameter)
{
    // Do something with "parameter"
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,我到了SelectedItemsAction,当我点击右键菜单项,但parameterIS null.我相信我的问题在于CommandParameter物业的制定者.如您所见,我想SelectedItems通过将值设置为:将此属性绑定到DataGrid 的属性:

<Setter Property="CommandParameter"
        Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" />
Run Code Online (Sandbox Code Playgroud)

我尝试过更简单的值作为测试:

<Setter Property="CommandParameter"
        Value="{Binding ElementName=EntityDataGrid, Path=Height}" />
Run Code Online (Sandbox Code Playgroud)

parameter还是null.然后只测试任何参数是否达到我的动作方法:

<Setter Property="CommandParameter" …
Run Code Online (Sandbox Code Playgroud)

.net wpf binding wpfdatagrid

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

WPF DataGridTextColumn多行输入

我在.NET 4中使用具有DataGridTextColumn的WPF DataGrid控件.

我希望能够输入多行文字.当我将数据绑定到列时,换行符的格式正确,但我发现在编辑文本时无法创建换行符.

<DataGrid ItemsSource="{Binding MyMessages}">
   <DataGrid.Columns>
      <DataGridTextColumn Header="Message" Binding="{Binding Path=Message}"  Width="Auto"/>
   <DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

有什么建议?

wpf wpfdatagrid

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

如何为WPF 4 DataGrid的列标题添加右键单击上下文菜单?

我希望DataGrid的列标题的上下文菜单与其他单元格不同.因此,使用常规ContextMenu属性是行不通的.有DataGrid.RowHeaderTemplate,但我找不到DataGrid.ColumnHeaderTemplate.

编辑/注意:列是动态生成的.

wpf wpfdatagrid

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

DataGridTextColumn可见性绑定

我正在尝试将列可见性绑定到另一个元素的可见性,如下所示:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
<StackPanel>
    <CheckBox x:Name="chkColumnVisible" Content="Show column" />
    <DataGrid x:Name="MyDataGrid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Column1" Visibility="{Binding ElementName=chkColumnVisible, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}"/>
        </DataGrid.Columns>
    </DataGrid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

但我在VS输出中得到这个错误:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IsChecked; DataItem=null; target element is 'DataGridTextColumn' (HashCode=48860040); target property is 'Visibility' (type 'Visibility')
Run Code Online (Sandbox Code Playgroud)

是否有纯XAML方法来实现这一目标?

c# wpf xaml wpfdatagrid

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

如何在WPF Datagrids中修复"双向绑定需要路径或XPath"异常?

这个问题的背景/上下文: 我有一个WPF桌面应用程序.它使用LINQ to SQL连接到其SQL数据库,并在WPF Datagrids中显示其数据.它的工作还算不错,但性能是一个问题,因为LINQ可能是致命的慢,所以我一直在交换我的逻辑和UI控制从LINQ数据库环境远尽可能,而是它们加载到本地变量,这是非常相似LINQ对象,大大提高了性能.

问题: 当我测试我的Datagrids时,我现在得到一个新的异常" 双向绑定需要Path或XPath. "当我尝试编辑一个Datagrid的某个(整数)列中的值时,尽管编辑字符串列已经工作得很好.我不明白为什么我会这样做,或者该怎么做.

因此,当datagrid.datacontext设置为LINQ实体关联时,它可以工作,但只有当它设置为普通对象列表时才能正常工作.我尝试将列表更改为ObservableCollection,但这没有明显的效果.

我已经在这里和其他网站上查看过十几个不同的相关问题,但我没有看到任何似乎有帮助的问题.

目前我有:

<DataGrid Margin="12,110,12,0" x:Name="dgDays" ItemsSource="{Binding}" 
                 Height="165" VerticalAlignment="Top" MinHeight="0" 
                 AutoGenerateColumns="False"
                 SelectionChanged="dgDays_SelectionChanged">
Run Code Online (Sandbox Code Playgroud)

...

<DataGrid.Columns>
            <DataGridComboBoxColumn Width="80" Header="Cook" x:Name="_DailyCookCombo" SelectedItemBinding="{Binding sCook}"/>
            <DataGridComboBoxColumn Width="80" Header="Eat" x:Name="_DailyDayCombo" SelectedItemBinding="{Binding sDay}"/>
            <DataGridTextColumn Width="52" Header="Prot" Binding="{Binding Protein}" />
            <DataGridTextColumn Width="52" Header="Carb" Binding="{Binding Carb}" />
            <DataGridTextColumn Width="52" Header="Fat" Binding="{Binding Fat}" />
            <DataGridTextColumn Width="62" Header="Prot %" Binding="{Binding ProteinPercent}" />
            <DataGridTextColumn Width="62" Header="Carb %" Binding="{Binding CarbPercent}" />
            <DataGridTextColumn Width="62" Header="Fat %" Binding="{Binding FatPercent}" />
            <DataGridTextColumn Width="116" Header="non PFW meals" Binding="{Binding …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf wpfdatagrid 2-way-object-databinding

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

当AutoGenerateColumns = True时,如何重命名DataGrid列?

我有一个简单的数据结构类:

public class Client {
    public String name {set; get;}
    public String claim_number {set; get;}
}
Run Code Online (Sandbox Code Playgroud)

我正在加入一个DataGrid:

this.data_grid_clients.ItemSource = this.clients;
Run Code Online (Sandbox Code Playgroud)

我想更改列标题.即:声明号码为"索赔号".我知道这可以通过执行以下操作手动创建列来完成:

this.data_grid_clients.Columns[0].Header = "Claim Number"
Run Code Online (Sandbox Code Playgroud)

但是,Columns在自动生成列时,该属性为空.有没有办法重命名列,还是我必须手动生成列?

c# wpf rename autogeneratecolumn wpfdatagrid

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