同じページにコンボボックスと 2 つのボタンがあります。ボタンは「前へ」と「次へ」です。理想的には、ボタンを使用してそれに応じてコンボボックスの項目を選択したいと思います。また、リストの最後または最初に到達したときに「次へ」および「前へ」ボタンを無効にしたいと思います。コードビハインドでこれを行うことに問題があるとは思いませんが、xaml/binding/mvvm を介してこれが可能かどうか疑問に思います。ありがとう。
3 に答える
はい、完全に可能です。まず、MVVM フレームワークを使用することを強くお勧めします。次に、Caliburn.Microなどのフレームワークを使用すると、ビュー内の sからビュー モデルの動詞 (メソッド) を簡単に呼び出すことができButton
ます。
したがって、たとえば、ビューに a があり、ビュー モデルに<Button x:Name="Next">Next</Button>
対応するメソッドがあります。public void Next()
Caliburn.Micro は、Button
クリック イベントから同じ名前のビュー モデルのメソッドへの規則ベースのバインディングを処理します。
Next
メソッドでは、現在のページをインクリメントします。これは、 を実装するビュー モデルのパブリック プロパティにもなりますINotifyPropertyChanged
。Caliburn.Micro などの MVVM フレームワークはPropertyChanged
、魔法のプロパティ名の文字列ではなく、ラムダ式を使用してイベントを呼び出すメソッドを提供します。
次に、ビューで、ComboBox
ItemsSource
を可能なページ番号のコレクションにバインドし、 をSelectedItem
現在のページのパブリック プロパティにバインドします。
ページングを行っているように聞こえるので、PagedListライブラリ (UI に依存しない) と対応する NuGet パッケージも検討することをお勧めします。
迅速かつ汚い実装。
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>
次のアプローチをお勧めします。
- 通常のコンボボックス
- Converter を使用して ComboBox SelectedIndex にバインドされた Enabled プロパティを持つボタン (前と次)
その後、通常のボタンイベントまたはスルーコマンドを使用して新しいインデックスを設定できます