Привязка коллекции <bool>к тумблерам / флажкам - PullRequest
0 голосов
/ 30 июня 2010

У меня есть коллекция bool, связанная с днями недели - Collection () {true, false, false, false, false, false, false, false}; Таким образом, все, что обозначает bool, означает, что эта коллекция применяется в воскресенье (здесь воскресенье - первый день недели).

Теперь я установил источник элементов моего списка, скажем, в эту коллекцию.

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

Однако моя Коллекция никогда не обновляется (моя коллекция является свойством зависимости от окна). Плюс класс «MyBool» - это просто оболочка вокруг объекта bool с реализованным NotifyPropertyChanged.

Любые идеи ..... мой реальный код в основном сложный, поэтому приведенная выше ситуация является жестко упрощенной версией, поэтому при необходимости делайте предположения и т.д.

Большое спасибо заранее,

U.

1 Ответ

1 голос
/ 30 июня 2010

Попробуйте установить 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});
        }
    }
}
...