Почему моя привязка данных не реагирует на PropertyChange? - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь привязать свой DataTrigger к свойству bool, но по какой-то причине он не хочет изменять значения.Он начинается как ложный, а затем, когда я выбираю RadioButton, он становится истинным, но значение не обновляет мой DataTrigger.Я попытался связать свойство Text TextBox, чтобы увидеть, какое значение было, и если оно меняется, но это не так. Вот видео, показывающее, как оно ведет себя

Как вы можете видеть, когда я отлаживаю, оно становится истинным, но не обновляет свойство Text.вернуться к истине, потому что вы выбираете новую кнопку RadioButton.Однако это не так.

Основная проблема Я пытаюсь привязать мой DataTrigger

<DataTrigger Binding="{Binding Path=EntryItemViewModel.IsEntrySelected}" Value="True">

к моему IsEntrySelected, но он никогда не читает значение какtrue, ЕСЛИ Я явно установил его в true в конструкторе

public EntryItemViewModel()
        {
            IsEntrySelected = true;
        }

MainWindows.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new EntryItemListViewModel();
    }
}

и MainWindow.xaml

<Grid>

        <!-- Animation -->
        <Grid.Resources>
            <system:Double x:Key="AddEntrySlideOffset">300</system:Double>
            <Storyboard x:Key="AddEntrySlideRight">
                <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                                 From="0" To="{StaticResource AddEntrySlideOffset}"
                                 Duration="0:0:0.2" />
            </Storyboard>
            <Storyboard x:Key="AddEntrySlideLeft">
                <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                                 From="{StaticResource AddEntrySlideOffset}" To="0"
                                 Duration="0:0:0.2" />
            </Storyboard>
        </Grid.Resources>


        <Grid Width="150"
              HorizontalAlignment="Left">
            <local:EntryItemListUserControl x:Name="MyUserControl"/>
        </Grid>

        <TextBox Text="{Binding EntryItemViewModel.IsEntrySelected}"
                 Width="200"
                 Height="25"/>

        <StackPanel Height="50"
                    Width="50"
                    Background="Gainsboro" Margin="375,128,367,241">
            <StackPanel.Style>
                <Style TargetType="StackPanel">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=EntryItemViewModel.IsEntrySelected}" Value="True">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard Storyboard="{StaticResource AddEntrySlideRight}" />
                            </DataTrigger.EnterActions>
                            <DataTrigger.ExitActions>
                                <BeginStoryboard Storyboard="{StaticResource AddEntrySlideLeft}" />
                            </DataTrigger.ExitActions>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Style>


            <StackPanel.RenderTransform>
                <TranslateTransform />
            </StackPanel.RenderTransform>
        </StackPanel>

    </Grid>

EntryItemUserControl.xaml

<ListBox HorizontalContentAlignment="Stretch"
             ItemsSource="{Binding Items}"
             SelectedItem="{Binding EntryItem}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Margin="0,2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <RadioButton Grid.Column="0"
                                 GroupName="Content"
                                 Content="{Binding Title}"
                                 IsChecked="{Binding IsEntrySelected}"/>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

EntryItemListViewModel.cs

public class EntryItemListViewModel : INotifyPropertyChanged
    {
        public ObservableCollection<EntryItemViewModel> Items { get; set; } = new ObservableCollection<EntryItemViewModel>();
        public EntryItemViewModel EntryItemViewModel { get; set; }  = new EntryItemViewModel();

        public EntryItemListViewModel()
        {
            Items.Add(new EntryItemViewModel { Title = "Hello World" });
            Items.Add(new EntryItemViewModel { Title = "Hello World" });
            Items.Add(new EntryItemViewModel { Title = "Hello World" });
            Items.Add(new EntryItemViewModel { Title = "Hello World" });
        }

        private EntryItemViewModel _entryItem;

        public EntryItemViewModel EntryItem
        {
            get { return _entryItem; }
            set
            {
                _entryItem = value;
                OnPropertyChanged(nameof(EntryItem));
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

И, наконец, EntryItemViewModel.cs

public class EntryItemViewModel : INotifyPropertyChanged
    {
        private string _title;

        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                OnPropertyChanged("Title");
            }
        }

        private bool _isSelected;

        public bool IsEntrySelected
        {
            get { return _isSelected; }
            set
            {
                _isSelected = value;
                OnPropertyChanged("IsEntrySelected");
            }
        }



        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы забыли упомянуть, как вы устанавливаете свойство источника, когда оно не работает.Но у вас есть одно свойство EntryItemViewModel и другое свойство EntryItem в вашем EntryItemListViewModel.Установка свойства IsEntrySelected для EntryItemViewModel должна работать.

Вы можете подтвердить это, например, обработав MouseLeftButtonDown для StackPanel в представлении:

private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var vm = DataContext as EntryItemListViewModel;
    vm.EntryItemViewModel.IsEntrySelected = true;
}
0 голосов
/ 27 августа 2018

Может быть, это поможет вам решить проблему.

<DataTrigger Binding="{Binding Path=EntryItemViewModel.IsEntrySelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Value="True">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...