嗨我怎么能以编程方式将Data列到Datagrid.我想通过codebehind文件中的代码来做到这一点.
此外,我想根据记录选择性地启用或禁用此按钮(如果状态为打开,则启用它,否则禁用此按钮).这里Status是DataSource中的一个列.
谢谢,阿比
由viky链接的答案总结了从源添加按钮列的想法.我已经汇总了一个简短的示例,其中还显示了问题的第二部分,即如何根据网格中的数据启用/禁用按钮.我在4.0中使用了DataGrid,但3.5的工具包也应该没问题.
首先,我从XAML添加一个Name列.这不是必需的,但只是表明您可以将XAML和C#添加组合到网格中.请注意,我在这里命名网格,以便我可以在C#partial类中引用它.
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Data Grid Populated in XAML and C#">
<Grid>
<DataGrid x:Name="_gridControl" IsReadOnly="True" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
现在,我在后面的代码中做了两件事.除了添加按钮列和数据元素(具有Name和Status)之外,我创建了一个Converter类,如果值为"Open"则返回true,否则返回false.然后,当设置Binding(而不是值)时,我还添加了我的转换器,以便在ItemsControl生成并绑定我的项目的容器时,显示的Button将其IsEnabled状态链接到我的项目的Status字段.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var buttonTemplate = new FrameworkElementFactory(typeof(Button));
buttonTemplate.SetBinding(Button.ContentProperty, new Binding("Name"));
buttonTemplate.SetBinding(Button.IsEnabledProperty, new Binding("Status")
{
Converter = new StatusToEnabledConverter()
});
buttonTemplate.AddHandler(
Button.ClickEvent,
new RoutedEventHandler((o, e) => MessageBox.Show("hi"))
);
this._gridControl.Columns.Add(
new DataGridTemplateColumn()
{
Header = "Close Button",
CellTemplate = new DataTemplate() { VisualTree = buttonTemplate }
}
);
this._gridControl.ItemsSource = new object[]
{
new { Name = "First Item", Status = "Open" },
new { Name = "Second Item", Status = "Open" },
new { Name = "Third Item", Status = "Closed" },
new { Name = "Fourth Item", Status = "Closed" },
new { Name = "Fifth Item", Status = "Open" }
};
}
}
public class StatusToEnabledConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
return "Open".Equals(value);
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
throw new System.NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
最后一个重要的注意事项是,我只在调用InitializeComponent后从C#修改DataGrid.对于具有XAML和C#部分的WPF内容控件,这很重要,因为在开始修改XAML中定义的对象之前,需要完成通过XAML完成的对象构造.
希望这可以帮助!