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