C# GridView和items控件绑定到同一属性
当我的C# GridView和items控件绑定到同一属性,c#,wpf,mvvm,binding,datagrid,C#,Wpf,Mvvm,Binding,Datagrid,当我的DataGrids选择editem和我的ListBox选择editem都绑定到同一个属性时,我看到了奇怪的行为 我的备份集合是一个数据表。我有一个DataGrid,其中ItemSource绑定到DataTable。我还有一个ListView,它的ItemSource绑定到同一个DataTable。一个视图是数据的网格显示,另一个视图基本上是一条时间线,直观地显示相同的数据。我正在画布上绘制项目,该画布是列表视图项目的ItemsTemplate。然后,我的视图模型中有一个绑定到两个集合的Se
DataGrids选择editem
和我的ListBox选择editem
都绑定到同一个属性时,我看到了奇怪的行为
我的备份集合是一个数据表
。我有一个DataGrid
,其中ItemSource
绑定到DataTable
。我还有一个ListView
,它的ItemSource
绑定到同一个DataTable
。一个视图是数据的网格显示,另一个视图基本上是一条时间线,直观地显示相同的数据。我正在画布上绘制项目,该画布是列表视图项目的ItemsTemplate
。然后,我的视图模型中有一个绑定到两个集合的SelectedItem
属性。所有这些都工作正常,我在列表框中选择了一个,它在数据网格中被选中,反之亦然。然后,我在每个ListViewItem
上都有一个弹出窗口
,其isOpen
属性绑定到ListboxItem
的isSelected
属性,因此如果您单击列表框中的某个项目
,弹出窗口将显示该项目的一些信息
问题是,当我在DataGrid
中单击一个项目时,我可以看到ListView
中的相应项目被选中,但是弹出窗口没有出现。奇怪的是,如果我在DataGrid
中向上或向下箭头,弹出窗口就会出现,或者如果我在DataGrid
中单击并拖动鼠标,上下选择行,弹出窗口也会出现。但是,如果我单击DataGrid
中的一行,则弹出窗口不会出现,即使我可以直观地看到列表框中的项目已被选中。我认为点击单元格会吃掉选定的项目或其他东西,但我不确定。这件事有点难办。希望我的描述有意义
ListView:(视图)
一个简单的代码简化版本可以演示您的问题,这将大大有助于人们提供帮助。添加了代码,希望它会有所帮助。可能与StaysOpen=false有关。StaysOpen=false表示当弹出窗口失去焦点时,弹出窗口将关闭。考虑到弹出窗口在您的场景中从来没有焦点(因为您当时正在使用DataGrid),可能是它的行为正确(弹出窗口没有显示为DataGrid有焦点,而不是弹出窗口)。我很惊讶当你按照StaysOpen进行上/下交互时,你会看到弹出窗口,它不应该显示。做得好,删除StaysOpen=False使其按预期运行。我知道我忽略了一些愚蠢的事情。我也很困惑,为什么用箭头或拖动鼠标时它会起作用。
<ListView ItemsSource="{Binding Path=ResultsView}" SelectedItem="{Binding Path=SelectedEvent, Mode=TwoWay}" Background="Transparent" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Background="Transparent" Width="Auto"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Rectangle Width="5" Height="9" />
<Popup IsOpen="{Binding Path=IsSelected, Mode=OneWay, RelativeSource={RelativeSource AncestorType=ListViewItem}}" StaysOpen="False">
</Popup>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListView>
<DataGrid ItemsSource="{Binding Path=ResultsView}" SelectionMode="Single" CanUserAddRows="False" CanUserSortColumns="true" CanUserDeleteRows="False" IsReadOnly="True"
SelectionUnit="FullRow"
SelectedItem="{Binding Path=SelectedEvent, Mode=TwoWay}" />
#region ResultsView
private DataView _ResultsView = new DataView();
public DataView ResultsView
{
get
{
return _ResultsView;
}
set
{
if (_ResultsView != value)
{
_ResultsView = value;
NotifyPropertyChanged("ResultsView");
}
}
}
#endregion
#region SelectedEvent
private DataRowView _SelectedEvent;
public DataRowView SelectedEvent
{
get
{
return _SelectedEvent;
}
set
{
if (_SelectedEvent != value)
{
_SelectedEvent = value;
NotifyPropertyChanged("SelectedEvent");
}
}
}
#endregion