C# 是否在属性更改时触发ListViewItem行为?

C# 是否在属性更改时触发ListViewItem行为?,c#,wpf,listview,windows-store-apps,behavior,C#,Wpf,Listview,Windows Store Apps,Behavior,我有一个自定义行为附加到我的ListViewItems,它在加载和DataContextChanged时触发 此行为的作用是遍历VisualTree,并通过确定其直接父对象,将可见性设置为可见或折叠 在初始加载时,每当我向ListView添加/删除ListViewItem时,它都能正常工作 但是,某些交互仅更改绑定到ListViewItem的ViewModel的属性。我要做的是,每当此属性发生更改时,我仍然希望触发仅为该ListViewItem设置可见性的自定义行为。因为DataContext和

我有一个自定义行为附加到我的ListViewItems,它在加载和DataContextChanged时触发

此行为的作用是遍历VisualTree,并通过确定其直接父对象,将可见性设置为可见折叠

在初始加载时,每当我向ListView添加/删除ListViewItem时,它都能正常工作

但是,某些交互仅更改绑定到ListViewItem的ViewModel的属性。我要做的是,每当此属性发生更改时,我仍然希望触发仅为该ListViewItem设置可见性的自定义行为。因为DataContext和Loaded不会触发,所以我的行为不会发生

有办法做到这一点吗

这是我的代码供参考:

<DataTemplate x:Key="DataTemplate_Item">
        <Grid x:Name="Grid_TemplateRoot">
            <i:Interaction.Behaviors>
                <Dovetail_UI_Register_Controls_Behaviors:SetItemVisibilityBehavior />
            </i:Interaction.Behaviors>
            <TextBlock Text={Binding Path="ItemName"}
        </Grid>
</DataTemplate>


如果您不将其发布为需要支持数据上下文作为任何对象传入的类库,那么您可以更新处理程序以侦听数据上下文上的那些属性更改

例如:

protected virtual void OnDataContextChanged(object sender, EventArgs args)
{
    ChangeVisibility();

    // Listen for any further changes which effect visibility.
    INotifyPropertyChanged context = ((FrameworkElement)sender).DataContext as INotifyPropertyChanged;
    context.PropertyChanged += (s, e) => ChangeVisibility();
}
您还可以进一步扩展它,例如,如果用于数据上下文更改的处理程序方法使用
DependencyPropertyChangedEventHandler
,那么您可以清理
PropertyChanged
处理程序。此外,您可以在
PropertyChanged
处理程序中只查看特定属性。扩展示例:

protected virtual void OnDataContextChanged(object sender, DependencyPropertyChangedEventHandler args)
{
    ChangeVisibility();
    INotifyPropertyChanged context;

    // Cleanup any handler attached to a previous data context object.
    context = e.OldValue as INotifyPropertyChanged;
    if (context != null)
        context.PropertyChanged -= DataContext_PropertyChanged;

    // Listen for any further changes which effect visibility.
    context = e.NewValue as INotifyPropertyChanged;
    if (context != null)
        context.PropertyChanged += DataContext_PropertyChanged;
}

private void DataContext_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "MyTargetProperty")
    {
        ChangeVisibility();
    }
}

这应该有多普遍?绑定的数据上下文是否都可以实现一些接口,以便在
OnDataContextChanged
中可以使用
IMyInterface context=((FrameworkElement)sender).DataContext作为IMyInterface
并附加属性更改事件的处理程序?这仅适用于特定的ListView。抱歉,我对这一点有点陌生,将处理程序附加到属性更改事件是什么意思?它与ViewModel的INotifyPropertChanged不同吗?谢谢如果您可以控制绑定的内容,并且您的视图模型正在使用
INotifyPropertyChanged
,那么您可以将我的内容更新为
INotifyPropertyChanged context=((FrameworkElement)sender);context.PropertyChanged+=(s,e)=>ChangeVisibility()太棒了!我测试了它,它工作了!我注意到的一件事是,我还有其他属性,它们确实提高了属性的更改。。。有没有可能我只听一个特定属性的变化,而不是所有属性的变化?我明白了!刚刚实现了我的方法,如下所示:private void SeatOrCourseNumberChanged(对象s,PropertyChangedEventArgs e),并像这样调用它:var vm=TypedAssociatedObject.DataContext作为CheckItemViewModel;vm.PropertyChanged+=(s,e)=>SeatOrCourseNumberChanged(s,e);你能把你的评论回复为回复吗?这样我就可以把它标记为答案了?非常感谢!
protected virtual void OnDataContextChanged(object sender, DependencyPropertyChangedEventHandler args)
{
    ChangeVisibility();
    INotifyPropertyChanged context;

    // Cleanup any handler attached to a previous data context object.
    context = e.OldValue as INotifyPropertyChanged;
    if (context != null)
        context.PropertyChanged -= DataContext_PropertyChanged;

    // Listen for any further changes which effect visibility.
    context = e.NewValue as INotifyPropertyChanged;
    if (context != null)
        context.PropertyChanged += DataContext_PropertyChanged;
}

private void DataContext_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "MyTargetProperty")
    {
        ChangeVisibility();
    }
}