1

В общем, есть такой список

<ListBox  SelectedItem="{Binding SelectedItem, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding ItemSource}">
   <ListBox.ItemTemplate>
       <DataTemplate>
           <Grid>
              <StackPanel>
                <TextBlock Text="{Binding Title}"/>
                <TextBlock Text="{Binding Description}"/>
                <TextBlock Text="{Binding Price}"/>
              </StackPanel>
              <CheckBox IsChecked="{Binding IsCheckedVM, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Right"/>
              <Button Command="{Binding SomeCommand}" CommandParameter="{Binding SelectedItem}" HorizontalAlignment="Right"/>
              </Grid>
       </DataTemplate>
   </ListBox.ItemTemplate>
</ListBox>

Как видите, в шаблоне элементов списка есть кнопка и чекбокс. Проблема только в том, что они не работают вообще. При нажатии на кнопку происходит стандартная анимация нажатия и на этом все, ничего не происходит. Чекбокс привязан к свойству IsCheckedVM, которое по умолчанию равно false, и когда нажимаешь на кнопку, то происходит определенная команда, которая за одно передает свойству IsCheckedVM состояние true и чекбокс должен быть checked. Но ничего не происходит и я не знаю почему. Даже если в конструкторе VM задать свойству IsCheckedVM = true, то чекбокс элемента все равно будет не checked. Т.е. чтобы я не делал, но я почему-то не могу воздействовать ни на кнопку, ни на чекбокс в элементе, что делать? Сами по себе эти кнопка с чекбоксом работают отлично, такая проблема возникает только если их запихнуть в шаблон, но мне это необходимо.

First Sin
  • 190
  • Сами по себе эти кнопка с чекбоксом работают отлично - это если за пределами ListBox? такая проблема возникает только если их запихнуть в шаблон - внутрь ListBoxItem? Если да, то в первом варианте у вас используется VM главная (назовем ее MainViewModel), а во втором случае у вас используется VM объекта, который вы указали в привязанной коллекции (прим: public List<ItemViewModel> { get; }). То есть ваша команда SomeCommand и все другие свойства должны быть внутри ItemViewModel. Если я "копаю" не в ту сторону, то предоставьте самодостаточный пример, что бы я мог проверить у себя. – EvgeniyZ Jun 10 '19 at 00:30
  • @EvgeniyZ да, именно так. То есть чтобы чекбокс с кнопкой работали, мне нужно прописать команду не в MainViewModel, а в VM объекта? – First Sin Jun 10 '19 at 13:01
  • Как один из вариантов, да. Либо привязывать к главной vm, либо вовсе пробрасывать главную vm в нужную vm через тот же конструктор. Но свою ошибку я думаю вы поняли. – EvgeniyZ Jun 10 '19 at 13:53
  • @EvgeniyZ все равно не получается, даже если в шаблоне у кнопки с чекбоксом напрямую задать DataContext, как например вот так <CheckBox.DataContext> <viewModel:MainVM/> </CheckBox.DataContext>

    То как бы так сказать, работает влияние на саму MainVM, т.е. например командой какое-то свойство меняется, но на саму VIEW это не влияет. По команде должно происходить определенное действие во View, но не происходит. И кстати вне шаблона если задать таким же образом кнопке с чекбоксом DataContext, они таким же образом начинают себя вести (т.е. также плохо)

    – First Sin Jun 10 '19 at 19:22
  • 1
    Оставлю это здесь. Ну а по вопросу, я вам сказал, что у вас 3 пути: 1. Создать все свойства в VM нужного объекта (который задан в привязанной коллекции). 2. Передать ссылку на главную VM внутрь VM объекта через конструктор и сделать там публичное свойство главной VM через которое и привязываетесь. 3. Привязаться через XAML к дочернему объекту с помощью FindAncestor. – EvgeniyZ Jun 10 '19 at 19:59
  • @EvgeniyZ О, спасибо большое, третий вариант помог – First Sin Jun 10 '19 at 20:44

0 Answers0