列表框中部分可见的项不会触发绑定命令
本文关键字:命令 绑定 中部 列表 | 更新日期: 2023-09-27 18:15:43
在我的XAML中,我有一个绑定到视图模型对象列表的ListBox。
用户控件被定义为使用这个TestViewModel作为它的数据上下文。在usercontrol中,我有2个命令按钮,它们绑定到使用iccommand模式的方法。在这些按钮的帮助下,我能够在上面提到的列表中添加和删除视图模型,这使得ListBox的高度增加(这使得滚动条出现)。
一切似乎都很好。然而,事情并不像预期的那样工作,当用户控件部分显示时,因为屏幕/应用程序的高度不够。
即使命令按钮是可见的,命令也不会被触发。相反,ListBox被滚动到最后一个项目,部分显示的项目变得完全可见。之后,该项的命令将按预期触发。
为ListBox设置一个固定的高度不是一个选项,因为应用程序必须支持不同的屏幕分辨率。
有谁知道怎么解决这个问题吗?或者这是一种预期行为?
Update:添加样例源代码。我当前的屏幕分辨率是1366x768。在那下面,我只能看到两个完全控制。第三个只能看到部分
窗口:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="clr-namespace:WpfApplication1"
Title="MainWindow" WindowState="Maximized">
<Window.DataContext>
<uc:MainViewModel></uc:MainViewModel>
</Window.DataContext>
<Grid>
<ListBox ItemsSource="{Binding VmList}"></ListBox>
</Grid>
</Window>
Viewmodel for window:
public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private ObservableCollection<TestViewModel> vmList;
public ObservableCollection<TestViewModel> VmList
{
get { return vmList; }
set
{
vmList = value;
OnPropertyChanged("VmList");
}
}
public MainViewModel()
{
VmList = new ObservableCollection<TestViewModel>()
{
new TestViewModel(1),
new TestViewModel(2),
new TestViewModel(3)
};
}
}
用户:
<UserControl x:Class="WpfApplication1.TestUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" Height="300" Width="200">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="85*"></ColumnDefinition>
<ColumnDefinition Width="15*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Border BorderThickness="1" BorderBrush="Gray" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2">
<Grid Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Border BorderThickness="2" BorderBrush="Black">
<Label Content="{Binding Count}"></Label></Border>
</Grid></Border>
<Button Grid.Row="0" Grid.Column="1" Width="30" Height="30" Command="{Binding OnControlAdd}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DataContext}">+</Button>
</Grid>
</UserControl>
Viewmodel for usercontrol:
public class TestViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private int count;
public int Count
{
get { return count; }
set { count = value; }
}
public ICommand OnControlAdd
{
get
{
return new RelayCommand(AddControl);
}
}
private void AddControl(object param)
{
MainViewModel mainView = param as MainViewModel;
if (null != mainView)
{
mainView.VmList.Add(new TestViewModel(mainView.VmList.Count + 1));
}
}
public TestViewModel(int count)
{
Count = count;
}
}
Datatemplate:
<DataTemplate DataType="{x:Type local:TestViewModel}">
<local:TestUserControl></local:TestUserControl>
</DataTemplate>
是的,这是预期的行为,首先ListBox
的ScrollViewer
将确保什么项目内容是完全可见,当你点击项目(它会吃点击,所以它不会到达按钮),只有这样你才能点击按钮内的项目。
<ListBox ScrollViewer.CanContentScroll="False" ... />