Wpf 将集合绑定到数据网格
我有下一个XAML。 我有三个问题: 1.我的DataGrid没有看到ObservableCollection。我在DataGrid XAML中按名称设置它。当我向集合添加新项时,DataGrid不会更新。为什么? 2.为什么我的图像绑定不起作用?我在cs文件中没有看到ImageConverter调用 3.如何从另一个类而不是MainWindow更新ObservableCollectionWpf 将集合绑定到数据网格,wpf,Wpf,我有下一个XAML。 我有三个问题: 1.我的DataGrid没有看到ObservableCollection。我在DataGrid XAML中按名称设置它。当我向集合添加新项时,DataGrid不会更新。为什么? 2.为什么我的图像绑定不起作用?我在cs文件中没有看到ImageConverter调用 3.如何从另一个类而不是MainWindow更新ObservableCollection <Window x:Class="ReikartzDataConverter.MainWindow"
<Window x:Class="ReikartzDataConverter.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:ReikartzDataConverter.img" Title="MainWindow" Height="650" Width="800">
<Window.Resources>
<DataTemplate x:Key="GridItems" />
<local:ImageConverter x:Key="ImageConverter"></local:ImageConverter>
</Window.Resources>
<Grid Width="780" Height="650">
<Grid.RowDefinitions>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition Height="50"></RowDefinition>
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="Process information" Height="28" HorizontalAlignment="Left" Margin="0,20,0,0" Name="label1" VerticalAlignment="Top" Width="235" />
<DataGrid Grid.Row="1" Width="780" Name="paysTable" Background="AntiqueWhite" AutoGenerateColumns="False" ItemsSource="{Binding Source={StaticResource GridItems}}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="EnitityType" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=EntityType}">
</Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="EnitityId" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=EnitityId}">
</Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="EventName" Width="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=EventName}">
</Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="EventMessage" Width="300">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=EventMessage}">
</Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding Path=/img/btn_delete.gif, Converter={StaticResource ImageConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<Label Grid.Row="2" Height="28" Name="lblError" VerticalAlignment="Top" Visibility="Hidden" Foreground="OrangeRed" FontWeight="Bold" FontSize="12" />
<Button Grid.Row="3" Content="Quit" Height="23" Name="button1" Margin="200 0 0 0" VerticalAlignment="Top" Width="75" Click="button1_Click" />
<Button Grid.Row="3" Content="Start" Height="23" Name="button2" Margin="150 0 200 0" VerticalAlignment="Top" Width="75" Click="button2_Click" />
</Grid>
</Window>
我的服务器代码
public partial class MainWindow : Window
{
/// <summary>
/// the grid data source
/// </summary>
public ObservableCollection<DataGridItem> GridItems
{
get;
set;
}
public MainWindow()
{
InitializeComponent();
InitDataSource();
}
private void InitDataSource()
{
GridItems = new ObservableCollection<DataGridItem>();
}
private void button2_Click(object sender, RoutedEventArgs e)
{
GridItems.Add(new DataGridItem
{
EnitityId = 1,
EnitityType = "new",
EventMessage = "microsoft",
EventName = "must"
});
}
}
公共部分类主窗口:窗口
{
///
///网格数据源
///
公共可观测集合项目
{
收到
设置
}
公共主窗口()
{
初始化组件();
InitDataSource();
}
私有void InitDataSource()
{
GridItems=新的ObservableCollection();
}
私有无效按钮2\u单击(对象发送者,路由目标)
{
添加(新的DataGridItem)
{
ENITYID=1,
entityType=“新建”,
EventMessage=“microsoft”,
EventName=“必须”
});
}
}
1:您的
是DataTemplate,而不是项资源,即您指定了DataTemplate类型的StaticResource,然后使用它。你应该删除这一行
2:Source=“{Binding
必须有ElementName、Source或RelativeSource来指定要绑定的元素。Path
是其元素的属性或字段
3:要从另一个类而不是从主窗口更新ObservableCollection,您应该为该类提供引用
public class Q
{
ObsrvableCollection elem;
public Q (ObsrvableCollection _elem)
{
this.elem = _elem;
}
}
如果您给它相应的对象,那么Q
类中elem
上的任何操作都将在主窗口中更新它。您的XAML充满了错误和误用,所有这些都是由于对基础知识的了解不足。请先阅读关于数据绑定的介绍文档(可能从).1.删除了DataTemplate并更改了ItemsSource=“{Binding GridItems}”,但不起作用。如果我在cs文件中的ItemsSource之前绑定GridItems=new ObservableCollection();paysTable.ItemsSource=GridItems;这就起作用了。如果我不绑定-不起作用}您需要设置MainWindow对应的DataContext。基本上,它将是Q
类的对象。然后您可以编写ItemsSource=“{Binding Elem}”
,其中Elem-public属性,它获取Elem
对象。