如何限制单元格的选择以排除DataGrid中的列?

时间:2010-10-05 21:11:13

标签: silverlight datagrid silverlight-4.0

我有一个基于数据网格的选择控件,它复制了Expression Blend中的Easing Function选择器。这是Easing Function project,所以你也会帮助自己:)

此选择器是屏幕上的永久固定装置,可以轻松尝试选项,同时仍然看起来像您通常从Blend下拉列表中选择的选项:

alt text

我需要阻止当前单元格进入最后一个“标题”列。

是否有一种简单的方法可以限制移动到列中,以便只能选择前3列?

2 个答案:

答案 0 :(得分:3)

我倾向于做这样的事情: -

 <Grid>
    <Grid.ColumnDefinitions>
       <ColumnDefinition Width="150" />
       <ColumnDefinition Width="50" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
       <RowDefinition />
       <RowDefinition Height="250" />
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal" Grid.ColumnSpan="2">
       <!-- Heading Text Blocks -->
    </StackPanel>
    <ListBox ItemsSource="{Binding SetOfFunctions}" Grid.Row="1">
       <ListBox.ItemsPanel>
           <ItemsPanelTemplate>
               <toolkit:WrapPanel />
           </ItemsPanelTemplate>
       </ListBox.ItemsPanel>
    </ListBox>
    <ItemsControl ItemsSource="{Binding SetOfFunctionNames}" Grid.Row="1" Grid.Column="1" />
  </Grid>

这是一个基本的骨架概念,这里唯一的选择器是ListView,源集合的适当大小和排序将达到所需的外观。

答案 1 :(得分:0)

从概念上讲,WPF和SL DataGrid很糟糕。任何需要行和列之间动态关系的东西都是hackish。例如,单元格的值无法在运行时计算,无需反映UI绑定,并且由DataGrid用于在单元格中显示值的硬连线策略确定。它假定Columns在数据源中显示特定对象,并假定它知道如何遍历该数据源。 (对于它的价值,我已经向至少一个WPF UI组件供应商“成功地”(他们的话,而不是我的话)论证了这一点,他们可能会创建一个以这种方式工作的DataGrid。)如果您熟悉Ext .js,这就是DataGrid在HTML / CSS / JS框架中的工作方式:DataGrid不知道如何处理DataSource,你必须告诉它该怎么做。一切都完全模块化,依赖的硬连接很少,没有反射就无法覆盖。

最好创建自己的类似DataGrid的控件,尤其是在没有大量行或列实现的情况下。您的控件应该让您随心所欲地遍历DataSource,并提供有关如何呈现单元格和编辑单元格的信息。单元格编辑器应该实现一个Flyweight模式来节省内存,但这只是因为这是一个标准技巧。