![](/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.