Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xaml 对行和列进行绑定的DataGrid?_Xaml_Templates_Binding_Datagrid - Fatal编程技术网

Xaml 对行和列进行绑定的DataGrid?

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绑定到名为Blocks的属性,该属性是视图模型中定义的块类型的BindingList:

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