以编程方式更改DataGridRow中的控件

时间:2011-03-25 16:00:07

标签: wpf wpfdatagrid

我有一个WPF DataGrid包含一个产品列表,在最后一列中有一个图像按钮,用于将Product项添加到Orders_Products集合中。这很有效。

现在,如果Product项已经在Orders_Products集合中,我想用“删除”图像按钮更改“添加”图像按钮。

我尝试使用LoadingRow事件,但似乎无法访问Image对象,因为还没有在LoadingRow事件中准备好...

我尝试了Image对象的Load事件,但是如果行在表单中不可见则不会被触发(当我必须滚动数据网格以查看该行时)。它在我对列进行排序时触发,并且该行在表单中直接可见。我疯了...... :(

我想我并没有做一些与众不同的事情,但我是WPF的新手,可能我会想念一些事情。

有人可以给我一个提示吗? 提前致谢, 乔

P.S。:我正在使用实体框架。

1 个答案:

答案 0 :(得分:1)

执行此操作的正确方法是将DataGrid绑定到要显示的对象集合(您可能已经这样做了)。

然后,手动定义DataGridTemplateColumn并将其CellTemplate设置为适当的DataTemplate(这通常会被定义为DataGrid中的资源或更高的DataTemplate中的资源元素的逻辑树)。

您可以看到上述操作的示例here

Product内,使用我对this question的回答中描述的技术,通过匹配数据绑定Product中相应属性的值来改变模板中显示的内容。< / p>

所有这些都可以完全在XAML中完成,这是在WPF中执行操作的首选方式。

更新(工作示例)

public class Product { public string Name { get; set; } public bool Exists { get; set; } }

MainWindow.xaml.cs

public partial class MainWindow : Window { public MainWindow() { this.Products = new List<Product> { new Product { Name = "Existing product", Exists = true }, new Product { Name = "This one does not exist", Exists = false }, }; InitializeComponent(); this.DataContext = this; } public IEnumerable<Product> Products { get; set; } }

MainWindow.xaml

<Window x:Class="SandboxWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.Resources> <DataTemplate x:Key="ButtonColumnTemplate" > <ContentControl x:Name="MyContentControl" Content="{Binding}" /> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Exists}" Value="True"> <Setter TargetName="MyContentControl" Property="ContentTemplate"> <Setter.Value> <DataTemplate> <TextBlock Text="Your Remove product button goes here" /> </DataTemplate> </Setter.Value> </Setter> </DataTrigger> <DataTrigger Binding="{Binding Exists}" Value="False"> <Setter TargetName="MyContentControl" Property="ContentTemplate"> <Setter.Value> <DataTemplate> <TextBlock Text="Your Add product button goes here" /> </DataTemplate> </Setter.Value> </Setter> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </Grid.Resources> <DataGrid ItemsSource="{Binding Products}" AutoGenerateColumns="False" CanUserAddRows="False"> <DataGrid.Columns> <DataGridTextColumn Header="Product Name" Binding="{Binding Name}" /> <DataGridTemplateColumn Header="Add/Remove" CellTemplate="{StaticResource ButtonColumnTemplate}" /> </DataGrid.Columns> </DataGrid> </Grid> </Window>

{{1}}