【问题标题】:Use DataTrigger in DataGridTemplateColumn.CellStyle在 DataGridTemplateColumn.CellStyle 中使用 DataTrigger
【发布时间】:2018-12-18 01:06:27
【问题描述】:

我有一个如下的数据网格,

<DataGrid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" ItemsSource="{Binding SelectedSet.Rows}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" CanUserAddRows="False" Style="{StaticResource DataGridStyle2}" HeadersVisibility="Column" SelectedItem="{Binding SelectedItem}" EnableRowVirtualization="False">
  <DataGrid.Columns>
    <DataGridTemplateColumn Width="30*"  Header="{StaticResource RangeColumnHeader}" HeaderStyle="{StaticResource HeaderStyle2}" SortMemberPath="StartValue">
     <DataGridTemplateColumn.CellStyle>
        <DataTrigger Binding="{Binding SelectedSet.IsDefault}" Value="True">
            <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding SelectedSet.IsDefault}" Value="False">
            <Setter Property="IsEnabled" Value="True"/>
        </DataTrigger>
    </DataGridTemplateColumn.CellStyle>
</DataGridTemplateColumn>
 </DataGrid.Columns>
</DatGrid>

我想使用“SelectedSet 的” IsDefault 属性来设置单元格的 IsEnabled 属性。

上面的代码我试过了,还是不行。

类定义如下,

public class UCSetModel : ViewModelBase
{

    private Set _SelectedSet;
    public Set SelectedSet
    {
        get
        {
            return _SelectedSet;
        }
        set
        {
            _SelectedSet = value;
            RaisePropertyChanged("SelectedSet");
        }
    }
}

 public class Set
{
    private ObservableCollection<Markers> _rows;
    public ObservableCollection<Markers> Rows
    {
        get
        {
            return _rows;
        }

        set
        {
            _rows = value;
            RaisePropertyChanged("Rows");
        }
    }

    private bool _isDefault;
    public bool IsDefault
    {
        get
        {
            return _isDefault;
        }

        set
        {
            _isDefault = value;
            RaisePropertyChanged("IsDefault");
        }
    }   
}

我想绑定到与行来自的同一“SelectedSet”的属性。

【问题讨论】:

  • Set 是单个行/项目的属性吗?还是应该同时启用/禁用该特定列中的所有单元格?
  • 您检查输出窗口是否有绑定错误?
  • Set 是在视图模型中定义的对象,'Rows' 是 Set 的属性,它是 ObservableCollection。

标签: wpf datagrid datatrigger datagridtemplatecolumn


【解决方案1】:

您发布的标记甚至无法编译。这样做:

<DataGridTemplateColumn.CellStyle>
    <Style TargetType="DataGridCell">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsDefault}" Value="True">
                <Setter Property="IsEnabled" Value="False"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGridTemplateColumn.CellStyle>

IsDefault 应该是Row 对象的属性,即您应该删除“Set”。从绑定路径假设一行没有Set 属性。

如果您想绑定到与行来源相同的SelectedSet 的属性,则应该像这样定义绑定:

<DataTrigger Binding="{Binding DataContext.SelectedSet.IsDefault, RelativeSource={RelativeSource AncestorType=DataGrid}}" Value="True">
    <Setter Property="IsEnabled" Value="False"/>
</DataTrigger>

【讨论】:

  • 我的意思是我想使用“Set”的 IsDefault 属性来设置单元格的 IsEnabled 属性。
  • @SAT:那你为什么不告诉...?请参阅我编辑的答案。
  • 您的回答比我的实际问题更准确地解释了我的问题。但是解决方案不起作用。
  • 那么您需要告诉我们什么不起作用,“不起作用”的实际含义以及您的类是如何定义的。你应该阅读this
  • 然后将绑定路径更改为SelectedSet.IsDefault。查看我的编辑。
【解决方案2】:

这对我有用,

    <DataTrigger Binding="{Binding Path=DataContext.SelectedSet.IsDefault,ElementName=SetWindow}" Value="True">
      <Setter Property="IsEnabled" Value="False"/>
   </DataTrigger>

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2017-08-09
    • 2011-09-10
    • 2011-11-26
    • 2011-01-15
    • 2017-07-06
    相关资源
    最近更新 更多