gpt4 book ai didi

wpf - WPF DataGridCell 模板中的动态绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 17:41:50 24 4
gpt4 key购买 nike

我对 WPF 中的数据绑定(bind) DataGrid 有疑问。我使用的是 VS 2010 Beta 2,它有自己的 DataGrid,而不是 Toolkit,虽然我认为它几乎相同。

我想绑定(bind)到一个有 52 列的数据集,一年中的每个星期都有一个。出于这个原因,我想动态绑定(bind)数据,而不是指定每个字段。根据某些条件,每个字段的值为真或假。基于此值,如果条件为真,我想在单元格模板中显示图像,如果条件不为真,则隐藏它。

我的问题是,我发现的所有使用模板的示例都涉及固定的预定义字段的情况,您可以在其中拥有像 Text =“{Binding UserName}”这样的绑定(bind)。这对我没有好处,因为我不知道在设计时字段名称是什么。

我已经做了一个简化的例子来说明这个问题。在此示例中,生成了一个包含真值和假值的数据表。我的模板中的图像永远不可见。根据数据中的真假值,我如何使它不可见?

<Window.Resources>

<!--This is the bit that doesn't work...-->
<Style TargetType="{x:Type Image}" x:Key="HideWhenFalse">
<Setter Property="Visibility" Value="Hidden" />
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=???}"
Value="True"> <!--What to put for the path? -->
<Setter Property="Visibility">
<Setter.Value>
Visible
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
<!--Up to here-->

<Style x:Key="{x:Type DataGridCell}" TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<Image Source="Images/tick.bmp" Style="{StaticResource HideWhenFalse}">

</Image>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>

<Grid>
<DataGrid
x:Name="myDataGrid"
AutoGenerateColumns="True" >

</DataGrid>
</Grid>

后面的代码:

公共(public)部分类 MainWindow : 窗口
{
public MainWindow()
{
InitializeComponent();

DataTable dtTable = new DataTable();

dtTable.Columns.Add("A", typeof(Boolean));
dtTable.Columns.Add("B", typeof(Boolean));
dtTable.Columns.Add("C", typeof(Boolean));
dtTable.Columns.Add("D", typeof(Boolean));
dtTable.Columns.Add("E", typeof(Boolean));
dtTable.Columns.Add("F", typeof(Boolean));

for (int i = 0; i < 5; i++)
{
object[] oValues = new Object[dtTable.Columns.Count];

for (int j = 0; j < dtTable.Columns.Count; j++)
{
oValues[j] = (j % 2 == 1) ? true : false;
}

dtTable.Rows.Add(oValues);
}

myDataGrid.ItemsSource = dtTable.DefaultView;
myDataGrid.Items.Refresh();
}

}

注意这可能很明显,我以完全错误的方式解决问题。这是一个坦白:几个月来,我一直在努力了解 WPF,但我似乎仍然发现自己以错误的方式处理每个问题。我希望一分钱能尽快下降。

最佳答案

您可以使用 MultiBinding ,第一个绑定(bind)从单元格(即行)获取实际数据上下文,第二个绑定(bind)获取列。从那里,您可以检索单元格值。

转换器代码:

public class RowColumnToCellConverter : IMultiValueConverter {
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) {
DataRowView row = values[0] as DataRowView;
DataGridColumn column = values[1] as DataGridColumn;
return row != null && column != null
? row[column.SortMemberPath]
: DependencyProperty.UnsetValue;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) {
throw new NotSupportedException();
}
}

XAML:
    <Style x:Key="{x:Type DataGridCell}" TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<TextBlock x:Name="TextOK" Text="OK" Visibility="Collapsed" />
</StackPanel>
<ControlTemplate.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource RowColumnToCellConverter}">
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}" Path="Column" />
</MultiBinding>
</DataTrigger.Binding>
<Setter TargetName="TextOK" Property="Visibility" Value="Visible" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

我用了 TextBlock而是用于测试的图像,但代码将相同。如果可以直接在 DataGridCell 中完成,请避免为图像定义样式。的风格。

关于wpf - WPF DataGridCell 模板中的动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2161062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com