![](/img/trans.png)
[英]How to correctly bind (update) a DataGrid with a CollectionViewSource
[英]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.