我有一个带有多个列的WPF Toolkit数据网格.我试图获得一个行为,您可以使用选项卡切换到网格,然后使用单个选项卡再次选项卡.例如,我不希望选中网格的所有列或单元格,只需进入一次,然后退出.
有没有一个简单的解决方案,我尝试将TabNavigation设置为Once,同时禁用TabStop(未在下面的代码中显示)并将列上的TabNavigation设置为None,但没有成功.
有什么我缺少或我需要在代码中处理Tab键吗?
<my:DataGrid Name="datagrid"
AutoGenerateColumns="False" IsReadOnly="True"
CanUserAddRows="False" CanUserDeleteRows="False"
Background="White"
KeyboardNavigation.TabNavigation="Once">
<my:DataGrid.Columns>
<my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" ></my:DataGridTextColumn>
<my:DataGridTextColumn x:Name="Ticker" Header="Ticker" Width="1*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn>
<my:DataGridTextColumn x:Name="OfficialName" Header="Name" Width="3*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn>
</my:DataGrid.Columns>
</my:DataGrid>
Run Code Online (Sandbox Code Playgroud) 我正在使用wpf 4.0中的datagrid.这有一个包含复选框的TemplateColumn.复选框的IsChecked属性通过绑定设置.
问题是,即使我明确指定绑定模式为TwoWay,它只能在一个方向上工作.
我必须提到,相同的代码在.net 3.5中与wpf工具包中的datagrid完美配合.
请查看.xaml和.cs内容.
提前致谢,
罗兰
<Window.Resources>
<DataTemplate
x:Key="IsSelectedColumnTemplate">
<CheckBox
IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"
/>
</DataTemplate>
</Window.Resources>
<Grid>
<DataGrid
x:Name="dataGrid"
AutoGenerateColumns="false"
CanUserAddRows="False"
CanUserDeleteRows="False"
HeadersVisibility="Column"
ItemsSource="{Binding}"
>
<DataGrid.Columns>
<DataGridTemplateColumn
Header="Preselected"
x:Name="myIsSelectedColumn"
CellTemplate="{StaticResource IsSelectedColumnTemplate}"
CanUserSort="True"
SortMemberPath="Orientation"
Width="Auto"
/>
</DataGrid.Columns>
</DataGrid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
和相关的.cs内容:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ObservableCollection<DataObject> DataSource = new ObservableCollection<DataObject>();
DataSource.Add(new DataObject());
DataSource.Add(new DataObject());
dataGrid.ItemsSource = DataSource;
}
}
public class DataObject : DependencyObject
{
public bool IsSelected
{
get { return (bool)GetValue(IsSelectedProperty); …Run Code Online (Sandbox Code Playgroud) 我有绑定到DataGrid的对象.我创建了一个绑定到对象的Is Default属性的单选按钮列.
当应用程序启动时,正确的项目显示为默认值,但是绑定随后不会更新.我想要的行为是用户检查一个单选框并使该对象成为默认值.
<DataGrid CanUserAddRows="False" AutoGenerateColumns="False" Name="TEst" >
<DataGrid.Columns >
<DataGridTextColumn Header="Value" Binding="{Binding Path=Name, Mode=OneTime}"/>
<DataGridTemplateColumn Header="Is Default">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<RadioButton GroupName="Test" IsChecked="{Binding IsDefault}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
private class Test : INotifyPropertyChanged
{
public string Name
{
get;
set;
}
bool isDefult;
public bool IsDefault
{
get
{
return isDefult;
}
set
{
isDefult = value;
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
public MainWindow()
{
this.InitializeComponent();
Test[] ya = new Test[] { new Test { Name …Run Code Online (Sandbox Code Playgroud) 我有静态数据,我想以Datagrid格式显示.这些值仅用于显示目的,不会更改.它可以作为Datagrid控件的某种子标签添加,以便我可以避免代码隐藏中的任何内容吗?
它必须是Datagrid控件,因为目的是试验和演示某些Datagrid UI功能与虚假blah blah内容.
如果无法获得纯XAML内容,那么为数据网格设置虚拟内容的最佳(快速和脏)方法是什么?可以在没有写课程等的情况下完成吗?
我想要一个可以的Custom DataGrid,
ComboBox非组合框,则组合框应该是DropDownOpen.请帮帮我.我在过去的几天里一直在尝试创建一个Custom DataGrid并编写了一些代码
protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
Run Code Online (Sandbox Code Playgroud)
但我失败了.
第一!我知道这似乎是一种重复,但事实并非如此.
我有一个网格作为数据模板DataGrid.RowDetails.它有三列:两列Width="Auto"和三维列Width="*"
<DataTemplate x:Key="NotEmptyDistributionsTemplateKey">
<DataGrid ItemsSource="{Binding SoftwareVersionDistributions}"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
CanUserResizeColumns="True"
CanUserSortColumns="False"
IsReadOnly="True"
CanUserResizeRows="False"
AutoGenerateColumns="False"
RowHeaderWidth="0"
Margin="20,5"
HorizontalAlignment="Stretch">
<DataGrid.Columns>
<DataGridTextColumn
Header="Architecture"
Binding="{Binding SoftwareArchitecture.Name, TargetNullValue=???, FallbackValue=???}"
Width="Auto"/>
<DataGridTextColumn
Header="Language"
Binding="{Binding SysCodepage.Title, TargetNullValue=???, FallbackValue=???}"
Width="Auto"/>
<DataGridHyperlinkColumn
Header="Link"
Binding="{Binding DownloadLink}"
Width="*"
CanUserResize="False"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
如果Grid嵌套在单元格中,此模板恰好显示3列.但是当它被用作RowDetaislTemplate第4个空列出现时.这让我很生气.
有没有人知道为什么会发生这种情况?
更新1.看起来如何:

更新2.
最后我找到了灵魂.刚刚添加ScrollViewer.HorizontalScrollBarVisibility="Disabled"
现在可以了:

但我无法理解这种奇怪的行为.
更新3(可能对某人有帮助)
最近我们发现了一个用户拥有的错误,开发人员没有.该错误再次涉及DataGrid的宽度和对齐方式.好吧,可能这不是一个真正的错误,但我们有不同的控件行为.
研究表明,安装.net framework 4.5安装程序时还更新了.net framework 4.0.此更新以某种方式改变了DataGrid的行为.(对于预期的一个)
我们要求我们的用户安装框架4.5并且问题消失了.虽然我们的应用仍然针对.net 4.0
我在GUI中有一个选项卡控件,其中一个选项卡中有WPF 4.0数据网格.当我单击网格中的单元格并编辑某些内容然后切换选项卡时,我收到了延迟刷新错误:
在AddNew或EditItem事务期间不允许使用DeferRefresh'.
因此,datagrid.CancelEdit(DataGridEditingUnit.Row)当切换选项卡以取消任何待处理的编辑并且延迟刷新问题消失时,我会调用.
但我真正想做的是CommitEdit()让用户不必再次重新输入数据.
并datagrid.CommitEdit(DataGridEditingUnit.Row, true)没有为我工作.我得到以下错误CommitEnd():
暂停调度程序处理时无法执行此操作.
PS:我已经尝试过datagrid.CommitEdit()和datagrid.CommitEdit(DataGridEditingUnit.Column,true),但它没有用.
我正在创建一个WPF数据网格,我希望能够通过拖放重新排序行,如下所示:我单击一行并向上或向下拖动它.像我一样,如果我释放鼠标,标记会显示行将被丢弃的位置.当我释放鼠标时,拖动的行将插入标记指示的位置.
有没有人看到任何文章或博客文章,说明如何做到这一点?如果我不需要,我不想重新发明轮子,谷歌也没有发现任何东西.谢谢.
我在从csv粘贴到wpf数据网格时遇到了麻烦 - 我已经按照这里的建议进行了操作
并且代码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) 我需要将Visibilitya DataGridTemplateColumn的一个属性绑定到一个外面的属性DataGrid.ItemsSource,因为我需要将所有行中的这个列绑定到其中的一个属性ViewModel,但据我所知你只是可以将它绑定到内部的某个属性,ItemsSource或者你应该使用ElementStyle,EditingElementStyle
我已经尝试过这段代码:
<DataGridTemplateColumn Header="post"
Visibility="{Binding DataContext.ProjectPostVisibility
, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>
Run Code Online (Sandbox Code Playgroud)
我确定我的绑定是正确的,因为当我绑定DataGridCell.Visibility下面的代码时它工作正常:
<DataGridTemplateColumn Header="post">
<DataGridTemplateColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Visibility" Value="{Binding DataContext.ProjectPostVisibility,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MvvmCommonControl:DataGrid}}"/>
</Style>
</DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn >
Run Code Online (Sandbox Code Playgroud) wpf ×10
wpfdatagrid ×10
binding ×3
.net ×2
datagrid ×2
xaml ×2
.net-4.0 ×1
c# ×1
c#-4.0 ×1
data-binding ×1
mvvm ×1
tabstop ×1
wpf-controls ×1