我正在构建一个使用WPF的应用程序,并且在解决如何在通过代码选择的ListView中显示新选择时遇到问题。更改ListView从代码中选择的项目
我有一个ListView与一堆物品。我想放置一个按钮,将选定的项目移动到视图中的下一个项目。要做到这一点,我必须能够取消选择一个项目,移动到下一个项目,然后选择它,以便选择实际显示给用户。
我的XAML代码如下:
<Border Grid.Row="1" CornerRadius="10" BorderBrush="Black" BorderThickness="10">
<ListView x:Name="lvLogPackets" Background="#FF0C3A58" Foreground="White" SelectionChanged="lvLogPackets_SelectionChanged" SelectedItem="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Path=IsSelected}">
<ListView.ContextMenu>
<ContextMenu Name="lvCMenu" Opened="menuOpened_click">
<MenuItem Header="Filter Checked" IsCheckable="True" Checked="menuViewCheckbox_Checked" Unchecked="menuViewCheckbox_Unchecked"/>
<MenuItem Header="Filter Selected" IsCheckable="True" Checked="menuViewSelected_Checked" Unchecked="menuViewSelected_Unchecked"/>
<Separator />
<MenuItem Header="Δt: N/A"/>
<Separator />
<MenuItem Header="Pop Out Data" Click="menuPopOut"/>
<Separator />
<MenuItem Header="Copy Payload CSV" Click="menuCopyPayloadCsv"/>
</ContextMenu>
</ListView.ContextMenu>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Green"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView x:Name="lvGridView">
<GridViewColumn Width="30">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Index" Width="100" DisplayMemberBinding="{Binding Path=Index}"/>
<GridViewColumn Header="SysTime" Width="100" DisplayMemberBinding="{Binding Path=SysTime}"/>
<GridViewColumn Header="ElapsedTime" Width="150" DisplayMemberBinding="{Binding Path=ElapsedTime}"/>
<GridViewColumn Header="Source" Width="100" DisplayMemberBinding="{Binding Path=Source}"/>
<GridViewColumn Header="Destination" Width="100" DisplayMemberBinding="{Binding Path=Destination}"/>
<GridViewColumn Header="CmdID" Width="100" DisplayMemberBinding="{Binding Path=CmdID}"/>
<GridViewColumn Header="PayloadSize" Width="100" DisplayMemberBinding="{Binding Path=PayloadSize}"/>
<GridViewColumn Header="Payload" Width="800" DisplayMemberBinding="{Binding Path=Payload}"/>
</GridView>
</ListView.View>
</ListView>
</Border>
我的应用程序的代码如下:
public class LogItem : INotifyPropertyChanged
{
public string Index { get; set; }
public string SysTime { get; set; }
public string ElapsedTime { get; set; }
public string Source { get; set; }
public string Destination { get; set; }
public string CmdID { get; set; }
public string PayloadSize { get; set; }
public string Payload { get; set; }
public bool _IsSelected;
public bool IsSelected
{
get { return _IsSelected; }
set { _IsSelected = value; NotifyPropertyChanged("IsSelected"); }
}
private bool _IsChecked;
public bool IsChecked
{
get { return _IsChecked; }
set { _IsChecked = value; NotifyPropertyChanged("IsChecked"); }
}
...
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string strPropertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(strPropertyName));
}
}
public partial class MainWindow : RibbonWindow
{
private ObservableCollection<LogItem> m_LogItems = new ObservableCollection<LogItem>();
private void RibbonWindow_Loaded(object sender, RoutedEventArgs e)
{
lvLogPackets.ItemsSource = m_LogItems;
}
}
我所有的其他绑定似乎正常工作,包括结合器isChecked。我在这里错过了什么?如何正确地将SelectedItem/s链接到我的数据,以便正确更新?
编辑:添加了Wyatt Earp所要求的主窗口代码。
^h ow来了'_IsChecked'被声明为私有,但是'_IsSelected'被宣布为公共是否存在访问级别差异的原因..并不重要,但是这是什么在我身上发现了最多 – MethodMan 2014-09-10 20:11:52
其中是这个属性绑定有一个为isChecked ' ' –
MethodMan
2014-09-10 20:13:33
它看起来像我的ListView的'SelectedItem'绑定到'IsSelected'属性。我怀疑这不是你想要的。此外,该片段缺少设置ItemsSource的位置。这是发生在你的代码隐藏吗?基本上,你希望你的ItemsSource绑定到一些'ObservableCollection',然后,'SelectedItem'应该绑定到同一个ViewModel上的'DataObject'。 –
2014-09-10 20:14:50