WPF DataGrid 未填充来自 viewmodel 的信息(DataBinding 不工作)
WPF DataGrid not populating with information from viewmodel (DataBinding not working)
我有一个名为 TagGridView
的 UserControl
和一个相应的 TagGridViewModel
,它包含一个 ObservableCollection<TagViewModel>
,使用数据绑定显示在 DataGrid
中。 TagViewModel
公开了一些我试图在 DataGrid
中显示的属性。
我创建了一个按钮,用于将项目添加到 ObservableCollection<TagViewModel>
并显示一个消息框,其中包含集合的项目计数和数据网格的项目计数。该集合正在获取所有项目,除了 DataGrid
始终表示其计数为 0。
这是带有数据绑定的 XAML 代码:
<UserControl x:Class="Company.TagVisualizer.Views.TagGridView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" Width="Auto" Height="Auto" Name="TagGrid" DataContext="{Binding Source=TagGridContext}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<DataGrid Name="DataGridTag" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=TagsCollection}" Margin="0" CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserAddRows="True" CanUserDeleteRows="True">
<DataGrid.Columns>
<DataGridCheckBoxColumn Width="*" Header="Selected" />
<DataGridTextColumn Width="3*" Binding="{Binding Path=TagName}" Header="Tag Name"/>
<DataGridTextColumn Width="3*" Binding="{Binding Detections.Count}" Header="Detections"/>
<DataGridTextColumn Width="3*" Binding="{Binding EarliestDetection}" Header="Earliest Detection"/>
<DataGridTextColumn Width="3*" Binding="{Binding LatestDetection}" Header="Latest Detection"/>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Column="0" Grid.Row="1" Content="Add" Click="Add_OnClick"/>
</Grid>
</UserControl>
这是 TagGridView 的代码隐藏文件:
public partial class TagGridView : UserControl
{
private TagGridViewModel _tagGridViewModel = new TagGridViewModel();
public TagGridView()
{
InitializeComponent();
}
public TagGridViewModel TagGridContext { get { return _tagGridViewModel; } set { _tagGridViewModel = value; } }
private void Add_OnClick(object sender, RoutedEventArgs e)
{
TagGridContext.TagsCollection.Add(new TagViewModel("Boogie", 134.5, 145.8));
MessageBox.Show(string.Format("Items in collection: {0}\nItems in Grid: {1}", TagGridContext.TagsCollection.Count, DataGridTag.Items.Count));
}
}
这里是 TagGridViewModel
class:
public class TagGridViewModel
{
private ObservableCollection<TagViewModel> _tagsCollection = new ObservableCollection<TagViewModel>();
public ObservableCollection<TagViewModel> TagsCollection
{
get { return _tagsCollection; }
set
{
_tagsCollection = value;
}
}
}
我不确定发生了什么。我尝试在 UserControl
标签和 DataGrid
标签中设置 DataContext。无论我做什么,DataGrid 都不会向自身添加任何项目。
是用户控件数据上下文问题。请参考下面的数据绑定代码。
<UserControl x:Class="Tags_Learning.TagGridView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" **DataContext="{Binding Path=TagGridContext, RelativeSource={RelativeSource Self}}"**>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<DataGrid Name="DataGridTag" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=TagsCollection}" Margin="0"
CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserAddRows="True" CanUserDeleteRows="True">
<DataGrid.Columns>
<DataGridCheckBoxColumn Width="*" Header="Selected" />
<DataGridTextColumn Width="3*" Binding="{Binding Path=TagName}" Header="Tag Name"/>
<DataGridTextColumn Width="3*" Binding="{Binding EarliestDetection}" Header="Earliest Detection"/>
<DataGridTextColumn Width="3*" Binding="{Binding LatestDetection}" Header="Latest Detection"/>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Column="0" Grid.Row="1" Content="Add" Click="Add_OnClick"/>
</Grid>
我有一个名为 TagGridView
的 UserControl
和一个相应的 TagGridViewModel
,它包含一个 ObservableCollection<TagViewModel>
,使用数据绑定显示在 DataGrid
中。 TagViewModel
公开了一些我试图在 DataGrid
中显示的属性。
我创建了一个按钮,用于将项目添加到 ObservableCollection<TagViewModel>
并显示一个消息框,其中包含集合的项目计数和数据网格的项目计数。该集合正在获取所有项目,除了 DataGrid
始终表示其计数为 0。
这是带有数据绑定的 XAML 代码:
<UserControl x:Class="Company.TagVisualizer.Views.TagGridView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" Width="Auto" Height="Auto" Name="TagGrid" DataContext="{Binding Source=TagGridContext}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<DataGrid Name="DataGridTag" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=TagsCollection}" Margin="0" CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserAddRows="True" CanUserDeleteRows="True">
<DataGrid.Columns>
<DataGridCheckBoxColumn Width="*" Header="Selected" />
<DataGridTextColumn Width="3*" Binding="{Binding Path=TagName}" Header="Tag Name"/>
<DataGridTextColumn Width="3*" Binding="{Binding Detections.Count}" Header="Detections"/>
<DataGridTextColumn Width="3*" Binding="{Binding EarliestDetection}" Header="Earliest Detection"/>
<DataGridTextColumn Width="3*" Binding="{Binding LatestDetection}" Header="Latest Detection"/>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Column="0" Grid.Row="1" Content="Add" Click="Add_OnClick"/>
</Grid>
</UserControl>
这是 TagGridView 的代码隐藏文件:
public partial class TagGridView : UserControl
{
private TagGridViewModel _tagGridViewModel = new TagGridViewModel();
public TagGridView()
{
InitializeComponent();
}
public TagGridViewModel TagGridContext { get { return _tagGridViewModel; } set { _tagGridViewModel = value; } }
private void Add_OnClick(object sender, RoutedEventArgs e)
{
TagGridContext.TagsCollection.Add(new TagViewModel("Boogie", 134.5, 145.8));
MessageBox.Show(string.Format("Items in collection: {0}\nItems in Grid: {1}", TagGridContext.TagsCollection.Count, DataGridTag.Items.Count));
}
}
这里是 TagGridViewModel
class:
public class TagGridViewModel
{
private ObservableCollection<TagViewModel> _tagsCollection = new ObservableCollection<TagViewModel>();
public ObservableCollection<TagViewModel> TagsCollection
{
get { return _tagsCollection; }
set
{
_tagsCollection = value;
}
}
}
我不确定发生了什么。我尝试在 UserControl
标签和 DataGrid
标签中设置 DataContext。无论我做什么,DataGrid 都不会向自身添加任何项目。
是用户控件数据上下文问题。请参考下面的数据绑定代码。
<UserControl x:Class="Tags_Learning.TagGridView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" **DataContext="{Binding Path=TagGridContext, RelativeSource={RelativeSource Self}}"**>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<DataGrid Name="DataGridTag" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=TagsCollection}" Margin="0"
CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserAddRows="True" CanUserDeleteRows="True">
<DataGrid.Columns>
<DataGridCheckBoxColumn Width="*" Header="Selected" />
<DataGridTextColumn Width="3*" Binding="{Binding Path=TagName}" Header="Tag Name"/>
<DataGridTextColumn Width="3*" Binding="{Binding EarliestDetection}" Header="Earliest Detection"/>
<DataGridTextColumn Width="3*" Binding="{Binding LatestDetection}" Header="Latest Detection"/>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Column="0" Grid.Row="1" Content="Add" Click="Add_OnClick"/>
</Grid>