CheckBox двусторонняя привязка не работает - PullRequest
1 голос
/ 27 декабря 2011

Я хочу сделать двустороннюю привязку для флажков внутри ListView.Это мой класс Product:

public class Product
{
    public bool IsSelected { get; set; }
    public string Name { get; set; }
}

В классе ViewModel у меня есть наблюдаемая коллекция продуктов:

    private ObservableCollection<Product> _productList;
    public ObservableCollection<Product> ProductList
    {
        get
        {
            return _productList;
        }
        set
        {
            _productList = value;
        }
    }

    public MainViewModel()
    {
        ProductList = new ObservableCollection<Product>
                          {
                              new Product {IsSelected = false, Name = "Not selected"},
                              new Product {IsSelected = true, Name = "Selected"},
                              new Product {IsSelected = true, Name = "Selected"}
                          };
    }
}

И, наконец, у меня есть Grid с ListView, который связывает мой ProductList:

<Grid>
    <ListView Height="120" HorizontalAlignment="Left" 
                  VerticalAlignment="Top"
                  SelectionMode="Multiple" 
                  ItemsSource="{Binding ProductList}" >
        <ListView.View>
            <GridView>
                <GridViewColumn Width="40">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Width="120" Header="Product Name" DisplayMemberBinding="{Binding Path=Name}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

Когда я отлаживаю это приложение, оно никогда не попадает в строку настройки, когда я ставлю / снимаю флажки.Есть идеи, что не так в этом коде?Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

Для двухсторонней привязки к работе вы должны в первую очередь реализовать событие INotifyPropertyChanged в своем представлении Модель и класс продукта, чтобы быть уверенным, что при каких-либо изменениях в представлении свойств, немедленно уведомляется

Также убедитесь, что вы правильно устанавливаете DataContext обзора

view.DataContext = yourViewModel;

и, как упоминал Фишерман, вы не сможете отлаживать такого рода свойства, вы должны сделать что-то подобное, если хотите отладить

 public class Product
    {
        private bool isSelected;

        public bool IsSelected
        {
            get { return isSelected; }
            set { isSelected = value; }
        }
    }
1 голос
/ 27 декабря 2011

Вы должны реализовать интерфейс связанного типа INotifyPropertyChanged, и в случае, когда IsSelected propertyis set , должны уведомить об этом.

Документы и образцы из MSDN:

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

1 голос
/ 27 декабря 2011

Вы связали CheckBox со свойством IsSelected. Это свойство реализовано как автоматически реализованное свойство . Вы никогда не сломаете сеттер или геттер в отладчике. Я не вижу никакой проблемы в вашем коде, она должна работать так, как вы ее кодировали.

...