首页 > 解决方案 > ItemsControl ItemTemplate DataTemplate 触发器未触发

问题描述

我在这里几乎绝望,不幸的是找不到解决方案。我有一个ItemsControl与一个DataTemplate绑定的ObservableCollectionPicDuinoModuleV2Ui一旦IsTriggered标志为真,我想更改Border. 不幸的是,触发器不会触发。PropertyChanged也是空的。

<ItemsControl Grid.Row="1" ItemsSource="{Binding ViewModel.Modules}" Margin="10">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border x:Name="Border1" BorderThickness="2" Background="WhiteSmoke" BorderBrush="Black" CornerRadius="5" Width="200" Height="200" Margin="5" Padding="5">
                ...
            </Border>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=IsTriggered}" Value="True">
                    <Setter TargetName="Border1" Property="Background" Value="LightGreen"></Setter>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
public class MainWindowViewModel : INotifyPropertyChanged, IDisposable
{
    public ObservableCollection<PicDuinoModuleV2Ui> Modules { get; } = new ObservableCollection<PicDuinoModuleV2Ui>();

    /// <summary>
    /// The PropertyChanged Eventhandler
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Raise/invoke the propertyChanged event!
    /// </summary>
    /// <param name="propertyName"></param>
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
public class PicDuinoModuleV2Ui : PicDuinoModuleV2, IPicDuinoModuleUiProperties
{
    public bool IsTriggered
    {
        get => _isTriggered;
        set
        {
            _isTriggered = value;
            OnPropertyChanged();
        }
    }

    private bool _isTriggered;

    /// <summary>
    /// The PropertyChanged Eventhandler
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Raise/invoke the propertyChanged event!
    /// </summary>
    /// <param name="propertyName"></param>
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

在此处输入图像描述

标签: c#wpfxamltriggers

解决方案


你的PicDuinoModuleV2Ui类没有实现INotifyPropertyChanged接口。尝试添加接口。

public class PicDuinoModuleV2Ui : PicDuinoModuleV2, IPicDuinoModuleUiProperties, INotifyPropertyChanged
{
  ...
}

推荐阅读