繁体   English   中英

如何通过正确的数据绑定将数据绑定到DataGrid?

[英]How to bind data to DataGrid by databinding correctly?

我有这样的 DataGrid

<UserControl x:Class="TV_MeshCreator.UserControls.UCClipProcessing"
             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" 
             xmlns:local="clr-namespace:TV_MeshCreator.UserControls"
             xmlns:vm="clr-namespace:TV_MeshCreatorEngine.Model.Binding;assembly=TV_MeshCreatorEngine"
             Background="WhiteSmoke"
             mc:Ignorable="d" 
             d:DesignHeight="800" d:DesignWidth="600">

    <UserControl.DataContext>
        <vm:UCClipProcessingModel/>
    </UserControl.DataContext>

    <Grid>
        <ScrollViewer>
            <StackPanel HorizontalAlignment="Stretch" 
                    VerticalAlignment="Stretch" >

                <GroupBox Header="Main configuration :" 
                      HorizontalAlignment="Stretch"

                      Height="Auto">

                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="90*"/>
                            <ColumnDefinition Width="10*"/>
                        </Grid.ColumnDefinitions>

                        <!--<ListView HorizontalAlignment="Stretch"
                                  x:Name="Lv_clip_folders"
                              VerticalAlignment="Stretch"
                              MinHeight="150"
                                  PreviewMouseLeftButtonUp="Lv_clip_folders_PreviewMouseLeftButtonUp"
                                  MaxHeight="150"
                              Margin="4, 4, 4, 4"
                              Grid.Column="0"/>-->

                        <DataGrid ItemsSource="{Binding Source=GridItems}"
                                x:Name="Dg_main_configuration"
                                  CanUserResizeColumns="False"
                                      AlternatingRowBackground="LightYellow"
                                      CanUserAddRows="False"
                                      MinHeight="150"
                                      MaxHeight="150"
                                      Grid.Column="0"
                                      AutoGenerateColumns="False">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="Path to calibration folder" Binding="{Binding ClipFolder}"/>
                                <DataGridComboBoxColumn Header="Geometry calibration folder"/>
                                <DataGridComboBoxColumn Header="Color calibration folder"/>
                            </DataGrid.Columns>
                        </DataGrid>

.......
......

所以,正如你所看到的,我设置了上下文

    <UserControl.DataContext>
        <vm:UCClipProcessingModel/>
    </UserControl.DataContext>

然后在我的UCClipPresessing.xalm.cs我正在创建


        public UCClipProcessing()
        {
            InitializeComponent();
            Model = new UCClipProcessingModel();
        }

然后我有一个方法来填充我的物品

        public void UpdateCLipProcessingGridItems(IList<ClipProcessingGridItem> folderList)
        {
            if (folderList != null)
            {
                this.Dispatcher.Invoke(() =>
                {
                    foreach (ClipProcessingGridItem tmp in folderList)
                    {
                        Model.GridItems.Add(tmp);
                    }

                });
            }
            else
            {
                Console.WriteLine("ERROR: folderList or empty or null");
            }
        }

并最终

    public class UCClipProcessingModel : BaseModel
    {
        private IList<ClipProcessingGridItem> _GridItems { get; set; }

        public ObservableCollection<ClipProcessingGridItem> GridItems
        {
            get { return GridItems; }
            set { GridItems = value; }
        }
    }

    public class ClipProcessingGridItem
    {
        public MCClipFolder ClipFolder { get; set; }

        //in future a few properties more will be here
    }

但是当我开始我的程序时,我什么也没看到......

我不太清楚.xalm如何知道我要绑定哪个UCClipProcessingModel对象? 因为我认为我在.xalm设置的对象和我在.cs文件中创建的对象不是同一个对象。

我究竟做错了什么?

有几件事是错误的。

您有两个 UCClipProcessingModel 实例,一个在 DataContext 中,一个在 Model 属性中。 只使用一个,例如通过

Model = (UCClipProcessingModel)DataContext;

ItemsSource 绑定声明是错误的。 使用路径而不是来源:

<DataGrid ItemsSource="{Binding Path=GridItems}" ...>

要不就

<DataGrid ItemsSource="{Binding GridItems}" ...>

GridItems 属性声明已损坏。 像这样声明一个只读的自动实现的属性:

public ObservableCollection<ClipProcessingGridItem> GridItems { get; }
    = new ObservableCollection<ClipProcessingGridItem>();

目前尚不清楚您为什么使用控件的 Dispatcher。 这也应该有效:

if (folderList != null)
{
    foreach (var item in folderList)
    {
        Model.GridItems.Add(var);
    }
}

或者可能没有 Model 属性,这似乎是多余的:

if (folderList != null)
{
    foreach (var item in folderList)
    {
        ((UCClipProcessingModel)DataContext).GridItems.Add(var);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM