WPF DataGrid SelectedItems在生产环境中不工作
WPF代码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
<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,为什么这会让你感到震惊?我昨天告诉过你的。