将集合<bool>绑定到togglebuttons / checkboxed </bool>

时间:2010-06-30 14:26:54

标签: c# wpf collections binding boolean

我有一系列bools与一周中的几天相关联 - Collection(){true,false,false,false,false,false,false};所以无论bool代表什么意味着这个集合适用于星期日(星期日是这周的第一天)。

现在我已将列表框的itemssource设置为此集合。

<ListBox ItemsSource={Binding Path=Collection, Mode=TwoWay}>
     <ListBox.ItemTemplate>
         <ToggleButton IsChecked={Binding Path=BoolValue, Mode=TwoWay}/>
     </ListBox.ItemTemplate>
</ListBox>

但是我的Collection永远不会更新(我的集合是窗口上的依赖项属性)。另外“MyBool”类只是一个bool对象的包装器,实现了NotifyPropertyChanged。

任何想法.....我的实际代码非常复杂,所以上面的情况是一个残酷简化的版本,所以如果有必要做出假设等我会提供我的实际代码。

非常感谢,

Ú

1 个答案:

答案 0 :(得分:1)

尝试在绑定

中设置UpdateSourceTrigger = PropertyChanged
<ToggleButton IsChecked={Binding Path=BoolValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}/>

编辑: 创造了一个小例子,似乎很好。

包装类

    public class MyBool : INotifyPropertyChanged
{
    private bool _value;

    public bool Value
    {
        get { return _value; }
        set
        {
            _value = value;
            NotifyPropertyChanged("Value");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

XAML

       <ListBox ItemsSource="{Binding Path=Users}" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <ToggleButton IsChecked="{Binding Path=Value, Mode=TwoWay}" Content="MyButton"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

背后的代码

 /// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public ObservableCollection<MyBool> Users { get; set; }
    public MainWindow()
    {
        InitializeComponent();
        Users = new ObservableCollection<MyBool>();
        DataContext = this;
        Loaded += new RoutedEventHandler(MainWindow_Loaded);

    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        FillUsers();
    }

    private void FillUsers()
    {

        for (int i = 0; i < 20; i++)
        {
            if(i%2 == 0)
                Users.Add(new MyBool { Value = true });
            else
                Users.Add(new MyBool {  Value = false});
        }
    }
}