0

我在同一页面上有一个组合框和两个按钮。按钮是“上一个”和“下一个”。理想情况下,我想使用按钮相应地选择组合框项目。另外,我希望在到达列表的结尾或开头时禁用“下一个”和“上一个”按钮。我认为在代码隐藏中执行此操作不会有问题,但我想知道这是否可以通过 xaml/binding/mvvm 实现。谢谢。

4

3 回答 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 回答