同じページにコンボボックスと 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 プロパティを持つボタン (前と次)
その後、通常のボタンイベントまたはスルーコマンドを使用して新しいインデックスを設定できます