我在同一页面上有一个组合框和两个按钮。按钮是“上一个”和“下一个”。理想情况下,我想使用按钮相应地选择组合框项目。另外,我希望在到达列表的结尾或开头时禁用“下一个”和“上一个”按钮。我认为在代码隐藏中执行此操作不会有问题,但我想知道这是否可以通过 xaml/binding/mvvm 实现。谢谢。
问问题
1078 次
3 回答
0
是的,这是完全可能的。首先,我强烈建议您使用 MVVM 框架,其次使用诸如Caliburn.Micro之类的框架,您可以轻松地从视图中Button
的 s 调用视图模型上的动词(方法)。
因此,例如,您<Button x:Name="Next">Next</Button>
的视图中有一个,视图模型中有一个相应的public void Next()
方法。Caliburn.Micro 将处理从Button
单击事件到具有相同名称的视图模型方法的基于约定的绑定。
在您的Next
方法中,您将增加当前页面。这也将是您的视图模型上的公共属性,它实现INotifyPropertyChanged
. 诸如 Caliburn.Micro 之类的 MVVM 框架提供了一种方法,该方法将PropertyChanged
使用 lambda 表达式而不是魔术属性名称字符串来调用事件。
然后,在您看来,您会将 绑定ComboBox
ItemsSource
到可能的页码集合,并将 绑定SelectedItem
到当前页面的公共属性。
听起来您正在分页,您可能还需要考虑PagedList库(与 UI 无关)和相应的 NuGet 包。
于 2013-08-29T20:22:50.013 回答
0
快速而肮脏的实施。
CS :
public partial class MainWindow : Window , INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
private List<string> _items;
public List<string> Items
{
get
{
if (_items == null)
_items = new List<string> { "1", "2", "3", "4", "5" };
return _items;
}
}
private string _selectedItem;
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
if(PropertyChanged!= null)
PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem"));
}
}
private ICommand _nextCommand;
public ICommand NextCommand
{
get
{
if (_nextCommand == null)
_nextCommand = new RelayCommand<string>(MoveToNext, CanMoveToNext);
return _nextCommand;
}
}
private ICommand _previousCommand;
public ICommand PreviousCommand
{
get
{
if (_previousCommand == null)
_previousCommand = new RelayCommand<string>(MoveToPrevious, CanMoveToPrevious);
return _previousCommand;
}
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
private void MoveToNext(object currentItem)
{
var currentIndex = _items.IndexOf((string)currentItem);
SelectedItem = _items.ElementAt(currentIndex + 1);
}
private bool CanMoveToNext(object currentItem)
{
return currentItem != null && _items.Last<string>() != (string)currentItem;
}
private void MoveToPrevious(object currentItem)
{
var currentIndex = _items.IndexOf((string)currentItem);
SelectedItem = _items.ElementAt(currentIndex - 1);
}
private bool CanMoveToPrevious(object currentItem)
{
return currentItem != null && _items.First<string>() != (string)currentItem;
}
}
XAML:
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Content="Next" Command="{Binding NextCommand}" CommandParameter="{Binding ElementName=box, Path=SelectedItem}"/>
<Button Content="Prev" Grid.Column="1" Command="{Binding PreviousCommand}" CommandParameter="{Binding ElementName=box, Path=SelectedItem}"/>
<ComboBox x:Name="box"
Grid.Row="1" Grid.ColumnSpan="2"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
/>
</Grid>
于 2013-08-29T20:33:05.533 回答
0
我建议采用以下方法:
- 常规组合框
- 启用属性的按钮(上一个和下一个)使用转换器绑定到 ComboBox SelectedIndex
然后,您可以使用常规按钮事件或通过命令设置新索引
于 2013-08-29T20:35:04.573 回答