WPF DataGrid SelectedItems在生产环境中不工作

WPF DataGrid SelectedItems在生产环境中不工作,wpf,Wpf,WPF代码 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:my="clr-namespace:WpfApplication1" xmlns:data

WPF代码

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1" xmlns:data="clr-namespace:System.Data;assembly=System.Data"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <ResourceDictionary>
            <my:tst x:Key="tst" />
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <DataGrid x:Name="grdDataTable"
                        CanUserAddRows="False" 
                        CanUserReorderColumns="False" 
                        Grid.Row="1"
                        SelectionMode="Single"
                        IsReadOnly="True"
                        CanUserResizeColumns="False" 
                        Margin="10" AutoGenerateColumns="True" 
                        SelectedItem="{Binding Path=SelectedRow,UpdateSourceTrigger=PropertyChanged}"
                        ItemsSource="{Binding Path=DtCollection, UpdateSourceTrigger=PropertyChanged,NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}">

            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Row.RowState}" Value="4">
                            <Setter Property="DataGridCell.Background" Value="Aqua"></Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Row.RowState}" Value="16">
                            <Setter Property="DataGridCell.Background" Value="AntiqueWhite" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
            <DataGrid.RowDetailsTemplate>

                <DataTemplate>
                    <DataGrid x:Name="InnerGrid" Height="80"  HeadersVisibility="Row" 
                              DataContext="{Binding Path=ItemsSource, ElementName=grdDataTable}"
                                         Background="DarkGray" 
                                          CanUserAddRows="False" 
                                          CanUserReorderColumns="False" 
                                          CanUserResizeColumns="False" 
                                          CanUserDeleteRows="False" 
                                          CanUserResizeRows="False" 
                                          CanUserSortColumns="False"
                                          Margin="-8,5,0,0" 
                                          AutoGenerateColumns="True" 
                                          SelectedItem="{Binding Path=SelectedRow,UpdateSourceTrigger=PropertyChanged}"
                                          Tag="{Binding Path=ItemsSource, ElementName=grdDataTable}">
                        <DataGrid.ItemsSource>
                            <Binding ElementName="grdDataTable" Path="SelectedItems"                                      
                                     UpdateSourceTrigger="PropertyChanged"  />
                            </DataGrid.ItemsSource>
                    </DataGrid>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>
    </Grid>
</Window>

代码隐藏

namespace WpfApplication1 {
    using System.ComponentModel;
    using System.Data;

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged 
    {


        private DataTable dtCollection=new DataTable();
        public DataTable DtCollection
        {
            get
            {
                return this.dtCollection;
            }
            set
            {
                this.dtCollection = value;
                OnPropertyChanged("DtCollection");

            }
        }

        public MainWindow()
        {
            InitializeComponent();

            LoadTable();
            this.grdDataTable.DataContext = this;


        }

        private void LoadTable()
        {
            DtCollection.Columns.Add("Name", typeof(string));
            DtCollection.Columns.Add("Add1", typeof(string));

            DtCollection.Columns.Add("Add2", typeof(string));

            for (int i = 0; i < 10; i++)
            {
                DataRow dr = DtCollection.NewRow();
                dr[0] = i.ToString();
                dr[1] = (i * 10).ToString();
                dr[2] = (i * 100).ToString();
                DtCollection.Rows.Add(dr);
            }
        }

        // Create the OnPropertyChanged method to raise the event 
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;
    }
}
命名空间WpfApplication1{
使用系统组件模型;
使用系统数据;
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口,INotifyPropertyChanged
{
私有数据表dtCollection=新数据表();
公共数据表DtCollection
{
得到
{
返回此.dt集合;
}
设置
{
this.dtCollection=值;
OnPropertyChanged(“DtCollection”);
}
}
公共主窗口()
{
初始化组件();
LoadTable();
this.grdDataTable.DataContext=this;
}
私有void加载表()
{
DtCollection.Columns.Add(“Name”,typeof(string));
Add(“Add1”,typeof(string));
Add(“Add2”,typeof(string));
对于(int i=0;i<10;i++)
{
DataRow dr=DtCollection.NewRow();
dr[0]=i.ToString();
dr[1]=(i*10).ToString();
dr[2]=(i*100).ToString();
DtCollection.Rows.Add(dr);
}
}
//创建OnPropertyChanged方法以引发事件
受保护的void OnPropertyChanged(字符串名称)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(此,新PropertyChangedEventArgs(名称));
}
}
公共事件属性更改事件处理程序属性更改;
}
}
上面的代码在开发机器上运行良好。我部署了 更改为生产,但一旦选择顶部网格上的行 在底部栅格上看不到任何内容。我很有信心这是正确的 存在一些绑定问题,但无法在生产系统上安装任何软件 检查。生产和发展的唯一区别在于 开发有.net的4.5版本,但生产有4.0版本。虽然我 我已经在4.0下开发了我的代码。编辑以下datagrid中的值后,应立即更改父行值。在我的本地机器上一切正常。我之所以在datatemplate中使用datagrid,是因为我需要执行所有验证,并且我的COL是动态的


我今天浪费了一整天的时间来解决这个问题,由于时间有限,请立即答复

我不敢告诉你,唯一能解决你问题的人就是你。向我们展示您的代码不会有帮助,因为我们无法重现您的问题。所有像你这样的问题都可以用同样的方法解决。在程序运行时,基本上需要找出各种对象的值。显然,您无法调试生产版本,因此您需要做更多的工作来找出值

主要有两种方法。。。第一个也是最简单的方法是添加一整套调用
MessageBox.Show
,提醒您注意各种对象的值。如果您可以在最终用户无权访问应用程序的情况下进行测试,那么这是可以的。如果他们这样做了,那么您需要添加某种日志记录,将值保存到数据库或文本文件中,您可以在运行应用程序后查看这些文件


一旦你知道了这些值,你就可以找出哪里出了问题。很可能与权限有关,或者可能与文件路径不正确有关。

您好,谢谢您的回复。我知道问题所在,实际问题是InnerGrid datagrid没有与指定的ItemSource绑定。我需要寻找任何其他选项来将内部网格与父网格中的selectedItems源绑定。我可以使用selectedItem而不是SelectedItems绑定,但父网格中的值仅在内部网格失去焦点时更新。如果应用程序是用.NET 4编写的,则无论客户端上是否安装了.NET 4.5,它都将在.NET 4中运行。我不认为那是你的问题。但是,如果您认为是这样,那么请尝试声明一个实现的类,并使您的类型集合
observedcollection
。然后,只需在填充类集合的
DataTable.Rows
集合中进行迭代即可。父网格的填充没有任何问题。当由于某种原因选择父datagrid行时,唯一的问题是InnerDatagrid未将selectedItems绑定到Itemsource。明天,我将附加一些图片以使其更清楚。如果我的应用程序在v4.0下运行,我卸载了.Net 4.5并面临同样的问题。这真让我震惊。我想当我们安装v4.5时,它会更新4.0目录中的几个dll,为什么这会让你感到震惊?我昨天告诉过你的。