【问题标题】:WPF DataGrid not populating with information from viewmodel (DataBinding not working)WPF DataGrid 未填充来自 viewmodel 的信息(DataBinding 不起作用)
【发布时间】:2023-04-11 01:36:01
【问题描述】:

我有一个名为TagGridViewUserControl 和一个对应的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 类:

public class TagGridViewModel
    {
        private ObservableCollection<TagViewModel> _tagsCollection = new ObservableCollection<TagViewModel>();

        public ObservableCollection<TagViewModel> TagsCollection
        {
            get { return _tagsCollection; }
            set
            {
                _tagsCollection = value;
            }
        }
    }

我不确定发生了什么。我尝试在UserControl 标记和DataGrid 标记中设置DataContext。无论我做什么,DataGrid 都不会向自身添加任何项目。

【问题讨论】:

    标签: wpf xaml mvvm datagrid


    【解决方案1】:

    是usercontrol Datacontext 的问题。数据绑定请参考以下代码。

    <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>
    

    【讨论】:

      猜你喜欢
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 2016-08-28
      • 1970-01-01
      相关资源
      最近更新 更多