Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF DataGrid ComboxColumn未更新绑定数据_Wpf_Vb.net_Data Binding_Wpfdatagrid - Fatal编程技术网

WPF DataGrid ComboxColumn未更新绑定数据

WPF DataGrid ComboxColumn未更新绑定数据,wpf,vb.net,data-binding,wpfdatagrid,Wpf,Vb.net,Data Binding,Wpfdatagrid,我的数据网格中有一个下拉列,组合框的选项存储在tmfCNCComponentStatus\u3d表中。我的主表有一个名为[Status]的列,它对应于该表中的键列 my datagrid中每一行的组合框中都会显示正确的状态[Description],但当用户更改选择时,数据库不会更新,即使一切看起来都正常工作。我已经将“UpdateSourceTrigger”设置为PropertyChanged,正如在许多类似的帖子中看到的那样,但仍然没有骰子。如有任何见解,将不胜感激 <Collecti

我的数据网格中有一个下拉列,组合框的选项存储在tmfCNCComponentStatus\u3d表中。我的主表有一个名为[Status]的列,它对应于该表中的键列

my datagrid中每一行的组合框中都会显示正确的状态[Description],但当用户更改选择时,数据库不会更新,即使一切看起来都正常工作。我已经将“UpdateSourceTrigger”设置为PropertyChanged,正如在许多类似的帖子中看到的那样,但仍然没有骰子。如有任何见解,将不胜感激

<CollectionViewSource x:Key="StatusItems"/>

                               <DataGridTemplateColumn x:Name="StatusColumn" Header="Status" Width="*" IsReadOnly="False">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock x:Name="cboStatus" Text="{Binding Path=Description}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox x:Name="StatusCombo" SelectedValuePath="CNCComponentStatusKey" DisplayMemberPath="Description" SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Source={StaticResource StatusItems}}" IsEditable="True" IsSynchronizedWithCurrentItem="True"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
谢谢你抽出时间

数据库:

状态表的内容:

数据网格:

这是昨天提出的问题的第一部分,让我明白这一点:

根据不同问题注释中的信息,您可能需要将
SelectedValuePath=“Status”
更改为
SelectedValuePath=“CNCComponentStatusKey”
。组合框中的列名称或项目属性对于回答此问题至关重要,但您尚未提供它们

当单元格离开编辑模式时,网格将更新DataRowView列值

Mode=TwoWay
在该绑定上是不必要的。这是
组合框上绑定的默认模式。SelectedValue

您可以从
TextBlock.Text上的绑定中删除所有这些装饰:考虑到它,它根本无法更新源代码,因此无需在XAML中详细说明它应该如何以及何时执行它无论如何都无法执行的操作


完整的工作示例 这就是我用来测试上述答案的代码。它更新主表中的行。它不会将表保存到数据库中。那是另一回事

我不知道你的专栏是否不是你想象的那样,或者是什么

MainWindow.xaml.cs

    public MainWindow()
    {
        InitializeComponent();

        LoadData();
    }

    #region Lists
    private static List<String> _status = new List<String>
    {
        "Ready",
        "Not Ready",
        "Weary",
        "Disordered",
    };

    private static List<String> _words = new List<String>
    {
        "Ewwrigowasaus",
        "Skubreuph",
        "Creecroicr",
        "Eunthaudrawtr",
        "Ootwoww",
        "Meuleetroithr",
        "Rewshr",
        "Scoysl",
        "Scewziexul",
        "Kawxayzeec",
    };
    #endregion Lists

    protected void LoadData()
    {
        DataTable dtMain = new DataTable();

        dtMain.Columns.Add("Status", typeof(int));
        dtMain.Columns.Add("Programmer", typeof(String));

        _words.ForEach(w =>
        {
            var row = dtMain.NewRow();
            row[0] = ((int)w[0] % 2) + 1;
            row[1] = w;
            dtMain.Rows.Add(row);
        });

        DataTable dtStatus = new DataTable();

        dtStatus.Columns.Add("CNCComponentStatusKey", typeof(int));
        dtStatus.Columns.Add("Description", typeof(String));

        _status.ForEach(s =>
        {
            var row = dtStatus.NewRow();
            row[0] = dtStatus.Rows.Count + 1;
            row[1] = s;
            dtStatus.Rows.Add(row);
        });

        DataGrid.ItemsSource = dtMain.DefaultView;

        var cvs = (FindResource("StatusItems") as CollectionViewSource);
        
        cvs.Source = dtStatus.DefaultView;
    }
public主窗口()
{
初始化组件();
LoadData();
}
#区域列表
私有静态列表_status=新列表
{
“准备好了”,
“还没准备好”,
“疲倦”,
“混乱”,
};
私有静态列表_words=新列表
{
“Ewwrigowasaus”,
“臭鼬”,
“Creecroicr”,
“Eunthaudrawtr”,
“Ootwoww”,
“Meuletroithr”,
“Rewshr”,
“Scoysl”,
“Scewziexul”,
“Kawxayzeec”,
};
#结束区域列表
受保护的void LoadData()
{
DataTable dtMain=新的DataTable();
添加(“状态”,typeof(int));
Add(“编程器”,typeof(字符串));
_words.ForEach(w=>
{
var row=dtMain.NewRow();
行[0]=((int)w[0]%2)+1;
行[1]=w;
dtMain.Rows.Add(行);
});
DataTable dtStatus=新DataTable();
添加(“CNCComponentStatusKey”,typeof(int));
添加(“说明”,typeof(字符串));
_status.ForEach(s=>
{
var row=dtStatus.NewRow();
行[0]=dtStatus.Rows.Count+1;
行[1]=s;
dtStatus.Rows.Add(行);
});
DataGrid.ItemsSource=dtMain.DefaultView;
var cvs=(FindResource(“StatusItems”)作为CollectionViewSource);
cvs.Source=dtStatus.DefaultView;
}
MainWindow.xaml

<Window.Resources>
    <CollectionViewSource x:Key="StatusItems" />
</Window.Resources>
<Grid>
    <DataGrid x:Name="DataGrid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Programmer}" Header="Programmer" />
            <DataGridTemplateColumn Header="Status">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Status}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ComboBox
                                ItemsSource="{Binding Source={StaticResource StatusItems}}"
                                SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}"
                                DisplayMemberPath="Description"
                                SelectedValuePath="CNCComponentStatusKey"
                                x:Name="Combo"
                                />
                            <!-- Selected value in combo -->
                            <Label Content="{Binding SelectedValue, ElementName=Combo}" />
                            <!-- Value of Status column in row -->
                            <Label Content="{Binding Status}" />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>


DataGridComboxColumn
很难使用。坚持使用模板列。您是否尝试过PresentationOnTraceSources.TraceLevel=High和DebugView?我无法使您在另一篇文章中链接的调试器在我的windows 10计算机上正常工作。它根本不会显示任何调试信息:(您是否尝试过调试|附加到进程?顺便说一句,您正在为
StatusItems
中的内容保密。除非您说出其中的内容,否则没有人可以帮助您。它是一个集合?集合中的内容?对象或数据行?属性或列的名称和类型是什么?我不明白我在xa中隐藏了什么在上面的ml中,你可以看到我声明了我的collectionviewsource。在代码中,特别是你昨天帮助我创建的底部部分,你可以看到我用数据填充视图源的位置。我已经做了所有这些更改,现在当我更改一个组合框值时,datagrid中的所有值都在更改以匹配lol。它们仍然是不要更改数据库不要将该组合放入
CellTemplate
,我删除了该建议,因为我看到了同样可笑的行为。在
CellEditingTemplate
中,它工作正常,只是您必须离开编辑模式才能更新,这是一个拖拽。因为[Status]是主表中用作包含组合框选项的另一个表的FK的列,我想我确实希望[Status]作为SelectedValuePath。我希望绑定查看行的[Status]值并查找到该状态的相应描述您错了。您误解了SelectedValuePath的含义。它包含对象(或行)的属性(或列)的名称在组合框中。而不是主网格中。组合框中。
SelectedValue
绑定绑定到主网格行的属性。您希望它如何在组合框中查找描述?基于什么?想想看。
<Window.Resources>
    <CollectionViewSource x:Key="StatusItems" />
</Window.Resources>
<Grid>
    <DataGrid x:Name="DataGrid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Programmer}" Header="Programmer" />
            <DataGridTemplateColumn Header="Status">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Status}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ComboBox
                                ItemsSource="{Binding Source={StaticResource StatusItems}}"
                                SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}"
                                DisplayMemberPath="Description"
                                SelectedValuePath="CNCComponentStatusKey"
                                x:Name="Combo"
                                />
                            <!-- Selected value in combo -->
                            <Label Content="{Binding SelectedValue, ElementName=Combo}" />
                            <!-- Value of Status column in row -->
                            <Label Content="{Binding Status}" />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>