将多个CheckBox绑定到ViewModel中的单个属性

时间:2014-06-18 15:08:34

标签: c# wpf xaml mvvm

我想将多个CheckBox项(IsChecked属性)绑定到ViewModel中的单个属性。

Weekdays

ViewModel属性名为SelectedWeekdays(int),是所有选定工作日的总和。我们的想法是,工作日值的每个可能组合总是会产生一个独特的总和。工作日在枚举中定义如下:

public enum Weekdays
{
    Monday = 1
    Tuesday = 2
    Wednesday = 4
    Thursday = 8
    Friday = 16
    Saturday = 32
    Sunday = 64
}

因此,例如,如果在视图上选择了星期二和星期四,则应该导致ViewModel属性值为10.

同样,如果ViewModel属性发生更改,例如3,则应检查星期一和星期二的CheckBox。

我看过MultiBindings,但似乎我只能使用它来将单个CheckBox绑定到多个值。你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

这对你有用吗?我没有实施ConvertBack。应该很容易。

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;

        SelectedWeekday = Weekdays.Tuesday;
    }

    private Weekdays _selectedWeekday;
    public Weekdays SelectedWeekday
    {
        get { return _selectedWeekday; }
        set
        {
            _selectedWeekday = value;
            if(PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("SelectedWeekday"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

[Flags]
public enum Weekdays
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}

public class WeekdayConverter : IValueConverter, INotifyPropertyChanged
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var day = (Weekdays)value;
        if ((day & Weekday) != 0)
            return true;
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        //Implement convertback
        throw new NotImplementedException();
    }

    private Weekdays _weekday;
    public Weekdays Weekday
    {
        get { return _weekday; }
        set
        {
            _weekday = value;
            if(PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Weekday"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

XAML:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:view="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <view:WeekdayConverter x:Key="MondayConverter" Weekday="Monday"></view:WeekdayConverter>
        <view:WeekdayConverter x:Key="TuesdayConverter" Weekday="Tuesday"></view:WeekdayConverter>
    </Window.Resources>
    <StackPanel>
        <CheckBox Content="Monday" IsChecked="{Binding SelectedWeekday, Converter={StaticResource MondayConverter}}" />
        <CheckBox Content="Tuesday" IsChecked="{Binding SelectedWeekday, Converter={StaticResource TuesdayConverter}}" />
    </StackPanel>
</Window>