Xaml 对行和列进行绑定的DataGrid?
如何获得这样一个数据网格,其中包含行和可重复单元格的模板 DataGrid绑定到名为Blocks的属性,该属性是视图模型中定义的块类型的BindingList:Xaml 对行和列进行绑定的DataGrid?,xaml,templates,binding,datagrid,Xaml,Templates,Binding,Datagrid,如何获得这样一个数据网格,其中包含行和可重复单元格的模板 DataGrid绑定到名为Blocks的属性,该属性是视图模型中定义的块类型的BindingList: <DataGrid x:Name="dgBlocks" DockPanel.Dock="Left" Margin="20,10,10,20" AutoGenerateColumns="False"
<DataGrid x:Name="dgBlocks" DockPanel.Dock="Left"
Margin="20,10,10,20" AutoGenerateColumns="False"
ItemsSource="{Binding Blocks, Mode=TwoWay}"
IsSynchronizedWithCurrentItem="True"
CanUserAddRows="False"
SelectionUnit="Cell" SelectionMode="Single"
EnableColumnVirtualization="False"
EnableRowVirtualization="False"
SelectedIndex="-1" MinRowHeight="10"
LoadingRow="dg_LoadingRow"
SelectionChanged="dgBlocks_SelectionChanged"
>
<DataGrid.Resources>
<helper:BindingProxy x:Key="proxy" Data="{Binding}" />
<!--todo: change to symbol’s ‘ReadOnly’ property instead of block’s ‘Permission’ -->
<Style x:Key="CellPermissionStyle" TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding Permission, Converter={StaticResource BlockPermissionToBrushConverter}}" />
<Setter Property="IsEnabled" Value="{Binding Permission, Converter={StaticResource BlockPermissionToBoolConverter}}" />
</Style>
</DataGrid.Resources>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Name="txtBlockRowHeader"
Text="{Binding Path=Header,
RelativeSource={RelativeSource AncestorType=DataGridRow}}">
</TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<DataGrid.Columns>
<DataGridTemplateColumn>
<!-- Selection checkboxes -->
<DataGridTemplateColumn.Header>
<StackPanel>
<CheckBox HorizontalAlignment="Center" IsThreeState="True" ToolTip="Select All" Margin="10,0,0,0">
<CheckBox.IsChecked>
<Binding Path="DataContext.SelectAll"
RelativeSource="{RelativeSource AncestorType={x:Type UserControl}}"
Mode="TwoWay"
UpdateSourceTrigger="PropertyChanged"
/>
</CheckBox.IsChecked>
</CheckBox>
</StackPanel>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Margin="5,0,0,0" IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="50">
<DataGridTemplateColumn.Header>
<TextBlock Text="Repeat" HorizontalAlignment="Center" />
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<telerik:RadNumericUpDown Name="nudRepeatBlock" ValueFormat="Numeric" Width="40"
ToolTip="Repeat block number of times" IsInteger="True" IsEditable="True"
Minimum="1" Maximum="100" UpdateValueEvent="PropertyChanged"
Value="{Binding Repeat, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MinWidth="40" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True" CanUserReorder="False" CanUserResize="False"
Visibility="{Binding Data.Encoding, Converter={StaticResource Encoding8b10bToCollapsedConverter}, Source={StaticResource proxy}}">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<!--todo: change… -->
<DataGridTextColumn Header="[0]" Binding="{Binding .Symbols[0].SymbolText, UpdateSourceTrigger=LostFocus}" CellStyle="{StaticResource CellPermissionStyle}" />
<DataGridTextColumn Header="[1]" Binding="{Binding .Symbols[1].SymbolText, UpdateSourceTrigger=LostFocus}" CellStyle="{StaticResource CellPermissionStyle}" />
<!-- … -->
<DataGridTextColumn Header="[15]" Binding="{Binding .Symbols[15].SymbolText, UpdateSourceTrigger=LostFocus}" CellStyle="{StaticResource CellPermissionStyle}" />
</DataGrid.Columns>
</DataGrid>
每个块对象都有一个名为“符号”的特性,定义为符号类型的绑定列表,以及一些其他特性。符号显示在带有标题[0]的列中,等等。其他块的特性显示在其他列中。例如,复选框、重复项、名称为IsSelected
public interface ISymbol
{
int Index { get; set; }
bool ReadOnly { get; set; }
string SymbolText { get; set; }
}
public class BlockBase : ObservableObject, IDataErrorInfo
{
public bool IsSelected
{
get { return _isSelected; }
set
{
if (value == _isSelected)
return;
_isSelected = value;
OnPropertyChanged("IsSelected");
RaiseSelectionChangedEvent();
}
}
public string Name { get; set; }
public virtual BindingList<ISymbol> Symbols { get; set; }
public BlockPermission Permission { get; set; }
public int Repeat { get; set; }
}
public class Symbol : ObservableObject, ISymbol
{
DisplayFormat Format { get; set; }
public int Index { get; set; }
public virtual bool ReadOnly { get; set; }
public virtual string SymbolText
{
get { return (Format == DisplayFormat.Binary) ? _binSymbol : _hexSymbol;
}
set
{
// … validate and set _binSymbol & _hexSymbol values
OnPropertyChanged("SymbolText");
}
}
公共接口ISymbol
{
int索引{get;set;}
bool只读{get;set;}
字符串SymbolText{get;set;}
}
公共类BlockBase:ObservieObject,IDataErrorInfo
{
公选学校
{
获取{return}isSelected;}
设置
{
如果(值==\u已选择)
返回;
_isSelected=值;
不动产变更(“IsSelected”);
RaiseSelectionChangedEvent();
}
}
公共字符串名称{get;set;}
公共虚拟绑定列表符号{get;set;}
公共块权限{get;set;}
公共整数重复{get;set;}
}
公共类符号:ObservieObject,ISymbol
{
DisplayFormat格式{get;set;}
公共int索引{get;set;}
公共虚拟bool只读{get;set;}
公共虚拟字符串SymbolText
{
获取{return(Format==DisplayFormat.Binary)?\u binSymbol:\u hexSymbol;
}
设置
{
//…验证并设置_binSymbol和_hexSymbol值
OnPropertyChanged(“SymbolText”);
}
}
现在,我需要将每个符号的单元格“IsEnabled”属性绑定到符号的“ReadOnly”属性。我试图在DataGrid.Resources中将其定义为CellPermissionStyle,但我不知道如何访问此级别的符号 此外,最好用模板替换符号的所有重复DataGridTextColumn防御
有人能帮我吗?我的研究刚刚证实,不幸的是,对于适用于列子集的模板或样式,无法做到这一点。正如米什卡所建议的那样,向样式或模板发送参数也是不可能的:( 因此,我的16列中的每一列都使用了“复制粘贴修改”单元格样式,如下所示:
<DataGridTextColumn Header="[0]" Binding="{Binding .Symbols[0].SymbolText, UpdateSourceTrigger=LostFocus}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding .Symbols[0].ReadOnly, Converter={StaticResource SymbolReadOnlyToBrushConverter}}" />
<Setter Property="IsEnabled" Value="{Binding .Symbols[0].ReadOnly, Converter={StaticResource SymbolReadOnlyToEnabledConverter}}" />
<Setter Property="TextBlock.TextAlignment" Value="Center" />
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
是的,我知道,这个XAML看起来很难看,但它对我来说是可行的,没有对现有代码库进行危险的重新设计
如果有人能建议在XAML中使用更好、更优雅的方法,我会很高兴。您能从您的XAML中显示整个数据网格,以及块定义代码吗?@Mishka,我已经用您要求的信息编辑了我的问题。谢谢您的单元格样式,它当前绑定到许可,而不是只读。我想,既然您使用了Convery无论如何,你可以绑定到“empty”,意思是块,然后在转换器中得到它的符号
<DataGridTextColumn Header="[15]" Binding="{Binding .Symbols[15].SymbolText, UpdateSourceTrigger=LostFocus}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding .Symbols[15].ReadOnly, Converter={StaticResource SymbolReadOnlyToBrushConverter}}" />
<Setter Property="IsEnabled" Value="{Binding .Symbols[15].ReadOnly, Converter={StaticResource SymbolReadOnlyToEnabledConverter}}" />
<Setter Property="TextBlock.TextAlignment" Value="Center" />
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>