【问题标题】:WPF DataGridColumn conditional controlWPF DataGridColumn 条件控制
【发布时间】:2014-06-30 00:16:53
【问题描述】:

我目前在我的数据网格中使用以下 DataGridHyperLinkColumn 定义显示一个超链接:

  <DataGridHyperlinkColumn Header="Item" Binding="{Binding Item, Mode=OneWay}">
    <DataGridHyperlinkColumn.ElementStyle>
      <Style>
        <EventSetter Event="Hyperlink.Click" Handler="ButtonItemInfo_OnClick"/>
      </Style>
    </DataGridHyperlinkColumn.ElementStyle>
  </DataGridHyperlinkColumn>

我想将其更改为有条件地显示超链接或标签(或文本块)。所以如果绑定值是“SH”,我想显示标签。否则我想要超链接。

我怎样才能做到这一点?

【问题讨论】:

    标签: c# wpf datagridcolumn


    【解决方案1】:

    我会将超链接绑定到一个命令,并在CanExecute 中有条件地返回 false。您可以设置禁用状态的超链接样式。

    <DataGrid ItemsSource="{Binding Items}">
      <DataGrid.Columns>
        <DataGridTemplateColumn Header="Item">
          <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
              <TextBlock>
                <Hyperlink Command="{Binding DataContext.Navigate, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                           CommandParameter="{Binding}">                  
                     <TextBlock Text="{Binding}" />
                </Hyperlink>
            </TextBlock>
            </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
      </DataGrid.Columns>
    </DataGrid>
    

    还有 ViewModel:

        public ObservableCollection<string> Items
        {
            get;
            set;
        }
    
        public ICommand Navigate
        {
            get
            {
                return new RelayCommand(
                    (param) => DoNavigate(param as string), // execute
                    (param) =>                              // can execute
                    {
                        var link = param as string;
                        return link != "SH";
                    });
            }
        }
    

    如果您确实需要某些行的文本框,您可以在列单元格样式中使用 DataTrigger。

    <DataGrid ItemsSource="{Binding Items}">
      <DataGrid.Columns>
        <DataGridTemplateColumn Header="Item">
          <DataGridTemplateColumn.CellStyle>
            <Style TargetType="DataGridCell">
              <Setter Property="Template">
                <Setter.Value>
                 <!-- Template for normal rows -->
                  <ControlTemplate>
                    <TextBlock>
                      <Hyperlink Command="{Binding DataContext.Navigate, 
                                   RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
                                 CommandParameter="{Binding}">                  
                        <TextBlock Text="{Binding}" />
                      </Hyperlink>
                    </TextBlock>
                  </ControlTemplate>
                </Setter.Value>
              </Setter>
              <Style.Triggers>
                <DataTrigger Binding="{Binding}" Value="SH">
                  <Setter Property="Template">
                    <Setter.Value>
                      <!-- Template for SH rows -->
                      <ControlTemplate>
                        <TextBlock Text="{Binding}" />
                      </ControlTemplate>
                    </Setter.Value>
                  </Setter>
                </DataTrigger>
              </Style.Triggers>
            </Style>
          </DataGridTemplateColumn.CellStyle>
    
        </DataGridTemplateColumn>
      </DataGrid.Columns>
    </DataGrid>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2014-08-29
      • 2017-02-07
      相关资源
      最近更新 更多