MVVMパターンを使用して観察可能なコレクションにバインドされているスポーツのチェックボックスリストがあります。ユーザーは好きなスポーツをいくつでも選択できます。[OK]ボタンを押すと、選択したスポーツをメッセージボックスに表示する必要があります(質問のためにコードを簡略化しています)。
[OK]ボタンは、1つ以上のスポーツが選択されている場合にのみ有効にする必要があります。現時点では、これは機能していません。ボタンの有効化/無効化は、を使用IsValid
して実行されます。チェックボックスの1つがチェックされるたびにこのメソッドを実行する方法はありますか。 ?
<Button IsEnabled="{Binding ElementName=checkBox1, Path=IsChecked}" />
ボタンを使用する前に有効性をチェックする必要がある開発コードに複数のプロパティがあり、Prismを使用しているため、使用できません。可能な限り、このメソッドを使用してこれを実現する必要がありIsValid
ます。
XAML
<Window x:Class="WpfApplication13.MVVM.ComboboxWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation"
xmlns:local="WpfApplication13.MVVM" Title="MainWindow" Height="170" Width="507">
<Grid>
<ListBox ItemsSource="{Binding Sports}" Name="lbModules" ScrollViewer.VerticalScrollBarVisibility="Visible"
Height="72" Margin="3" VerticalAlignment="Top">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Text}" IsChecked="{Binding IsChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Name="chkModules" Margin="0,5,0,0" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Height="27" Width="70" Margin="3,80,3,3" VerticalAlignment="Top"
Content="OK" HorizontalAlignment="Left"
prism:Click.Command="{Binding Path=NewCommand}"></Button>
</Grid>
</Window>
モデルを表示
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using Microsoft.Practices.Composite.Presentation.Commands;
namespace WpfApplication13.MVVM
{
public class MainWindowViewModel : INotifyPropertyChanged
{
public DelegateCommand<object> NewCommand { get; protected set; }
public event PropertyChangedEventHandler PropertyChanged;
private ObservableCollection<ListHelper> modules = new ObservableCollection<ListHelper>();
public ObservableCollection<ListHelper> Sports
{
get { return modules; }
set { modules = value; OnPropertyChanged("Sports"); }
}
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
NewCommand.RaiseCanExecuteChanged();
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public MainWindowViewModel()
{
ListHelper item1 = new ListHelper() { Text = "Footbal", IsChecked = false };
ListHelper item2 = new ListHelper() { Text = "Boxing", IsChecked = false };
ListHelper item3 = new ListHelper() { Text = "Basketball", IsChecked = false };
Sports.Add(item1);
Sports.Add(item2);
Sports.Add(item3);
NewCommand = new DelegateCommand<object>(NewTemplate, IsValid);
}
private bool IsValid(object parameter)
{
//TODO:This method must execute EVERYTIME any of the checkboxes are checked\unchecked.(currently not happening)
//The return value then determines the enabled state of the button.
return Sports.Any(e => e.IsChecked);
}
private void NewTemplate(object parameter)
{
//Display a list of selected sports
string sports = String.Empty;
Sports.Where(e => e.IsChecked).ToList().ForEach(c => sports += c.Text + " ");
MessageBox.Show(sports);
}
}
public class ListHelper
{
public String Text { get; set; }
private bool isChecked = false;
public Boolean IsChecked
{
get { return isChecked; }
//The setter is executed everytime the checkbox is checked
set {isChecked = value;}
}
}
}