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