【发布时间】:2014-09-10 20:06:15
【问题描述】:
我正在使用 WPF 构建一个应用程序,但无法弄清楚如何在通过代码选择的 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 的要求添加了 MainWindow 代码。
【问题讨论】:
-
为什么
_IsChecked被声明为私有,但_IsSelected被声明为公共访问级别差异是否有原因.. 这并不重要,但这是最让我印象深刻的原因跨度> -
这个属性绑定在哪里你有一个 isChecked
<CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> -
在我看来,您的 ListView 的
SelectedItem已绑定到IsSelected属性。我怀疑这不是你想要的。此外,在设置 ItemsSource 的位置缺少此 sn-p。这是否发生在您的代码隐藏中?基本上,您希望您的 ItemsSource 绑定到某个ObservableCollection<DataObject>,然后,SelectedItem应该绑定到同一 ViewModel 上的DataObject。 -
我不确定您所说的“SelectedItem”应该绑定到同一个 ViewModel 上的 DataObject 是什么意思。我正在尝试将它绑定到 DataObject 的属性,就像我对 IsChecked 所做的那样。