【问题标题】:Binding a Collection<bool> to togglebuttons/checkboxed绑定 Collection<bool> 以切换按钮/复选框
【发布时间】:2023-03-05 14:19:01
【问题描述】:

我有一组与星期几相关的布尔值 - 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>

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

任何想法.....我的实际代码非常复杂,因此上述情况是一个非常简化的版本,因此如有必要,请做出假设等鉴于我提供了我的实际代码,我会解决这个问题。

提前非常感谢,

U.

【问题讨论】:

    标签: c# wpf collections binding boolean


    【解决方案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});
            }
        }
    }
    

    【讨论】:

    • 恐怕这也没什么用....明天早上再去看看,如果发现什么我会回复
    • 如果没有某种代码来帮助更新,我似乎无法做到这一点......有没有人知道直接绑定?谢谢你
    • 它非常相似....由于版权问题等原因,我不能给你确切的代码。我真的很想知道如何处理这样的绑定。我有一个带有 bool 集合的对象,绑定到一组 7 个切换按钮,更新逻辑是如何执行的?
    • 有什么想法吗?任何人?我被困在这里......似乎可以在没有一些黑客的情况下执行双向绑定......
    • 更新逻辑是由实现 INotifyPropertyChanged 的​​集合中的类型获得的,bool 不这样做,因此必须包装在一个类中。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多