DataGrid 行 datatrigger/template
DataGrid row datatrigger/template
我有以下 DataGrid
:
<DataGrid ItemsSource="{Binding Coll.View}" SelectedItem="{Binding SelectedTransaction}"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Date" Binding="{Binding Date}" Width="100" />
<DataGridTextColumn Header="Category" Binding="{Binding Path=SelectedCategory.CategoryName}" Width="100" />
<DataGridTextColumn Header="Payee" Binding="{Binding Path=SelectedPayee.PayeeName}" Width="100" />
<DataGridTextColumn Header="Withdrawal" Width="100" />
<DataGridTextColumn Header="Deposit" Width="100" />
<DataGridTextColumn Header="Total" Binding="{Binding AccountBalance}" Width="100" />
</DataGrid.Columns>
交易是 ObservableCollection
个 TransactionViewModel
项。
这些项目有这个 属性 这是一个枚举,可以是:存款,取款。
private TransactionTypes tType;
public TransactionTypes TransactionType
{
get { return tType; }
set
{
tType = value;
OnPropertyChanged("TransactionType");
}
}
还有这个:
public double? TransactionAmmount
{
get { return ammount; }
set
{
ammount = value;
OnPropertyChanged("TransactionAmmount");
}
}
是否可以根据TransactionType的值来绑定TransactionAmmount?如果 TransactionType 是 Deposit,则将 TransactionAmmount 绑定到 Deposit 数据网格列。
如果 TransactionType 是 Withdrawal,则将 TransactionAmmount 绑定到 Withdrawal 列。
您必须结合触发器使用 ElementStyle 和 EdittingElementStyle 来实现您想要的效果:
<DataGridCheckBoxColumn Header="OK" Binding="{Binding Goedgekeurd,UpdateSourceTrigger=PropertyChanged}"
ElementStyle="{StaticResource GoedkeuringCheckBoxStyle}"
EditingElementStyle="{StaticResource GoedkeuringCheckBoxStyle}"/>
样式是在资源中预先定义的:
<Style x:Key="GoedkeuringCheckBoxStyle" TargetType="CheckBox">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsWachtOpGoedkeuringKlant}" Value="False">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
这里的示例取自我的代码,我没有更改它们以完全符合您的问题,但我希望您能了解正在发生的事情并根据您的需要进行调整。
关键是绑定总是在行级别。
但是如果您使用 MVVM,那么您可以在视图模型中而不是在视图中执行逻辑。这可以使事情变得更简单。
我有以下 DataGrid
:
<DataGrid ItemsSource="{Binding Coll.View}" SelectedItem="{Binding SelectedTransaction}"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Date" Binding="{Binding Date}" Width="100" />
<DataGridTextColumn Header="Category" Binding="{Binding Path=SelectedCategory.CategoryName}" Width="100" />
<DataGridTextColumn Header="Payee" Binding="{Binding Path=SelectedPayee.PayeeName}" Width="100" />
<DataGridTextColumn Header="Withdrawal" Width="100" />
<DataGridTextColumn Header="Deposit" Width="100" />
<DataGridTextColumn Header="Total" Binding="{Binding AccountBalance}" Width="100" />
</DataGrid.Columns>
交易是 ObservableCollection
个 TransactionViewModel
项。
这些项目有这个 属性 这是一个枚举,可以是:存款,取款。
private TransactionTypes tType;
public TransactionTypes TransactionType
{
get { return tType; }
set
{
tType = value;
OnPropertyChanged("TransactionType");
}
}
还有这个:
public double? TransactionAmmount
{
get { return ammount; }
set
{
ammount = value;
OnPropertyChanged("TransactionAmmount");
}
}
是否可以根据TransactionType的值来绑定TransactionAmmount?如果 TransactionType 是 Deposit,则将 TransactionAmmount 绑定到 Deposit 数据网格列。
如果 TransactionType 是 Withdrawal,则将 TransactionAmmount 绑定到 Withdrawal 列。
您必须结合触发器使用 ElementStyle 和 EdittingElementStyle 来实现您想要的效果:
<DataGridCheckBoxColumn Header="OK" Binding="{Binding Goedgekeurd,UpdateSourceTrigger=PropertyChanged}"
ElementStyle="{StaticResource GoedkeuringCheckBoxStyle}"
EditingElementStyle="{StaticResource GoedkeuringCheckBoxStyle}"/>
样式是在资源中预先定义的:
<Style x:Key="GoedkeuringCheckBoxStyle" TargetType="CheckBox">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsWachtOpGoedkeuringKlant}" Value="False">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
这里的示例取自我的代码,我没有更改它们以完全符合您的问题,但我希望您能了解正在发生的事情并根据您的需要进行调整。 关键是绑定总是在行级别。
但是如果您使用 MVVM,那么您可以在视图模型中而不是在视图中执行逻辑。这可以使事情变得更简单。