2014-06-18 89 views
2

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

Weekdays

视图模型属性称为SelectedWeekdays(int)和是所有选定平日的总和。这个想法是,周日值的每种可能组合总是会产生一个独特的总和。平日在一个枚举定义为这样:

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

因此,例如,如果星期二和星期四是在视图中选择,这将导致的10

一个ViewModel属性值同样地,如果视图模型财产变化,比如说3,星期一和星期二的CheckBoxes应该被检查。

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

+0

你也许能够使用[转换器](http://msdn.microsoft.com/en-us/library/system.windows.data.binding。转换器(v = vs.110).aspx),但是我已经使用WPF已经有一段时间了。 –

+0

您是否想过使用与所有复选框关联的单个onClick或valueChanged事件? – AntoineLev

回答

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> 
+0

你能否也请加转换回来?我希望能够选择多个复选框,而不仅仅是一个。 –

相关问题