C# 是否在属性更改时触发ListViewItem行为?
我有一个自定义行为附加到我的ListViewItems,它在加载和DataContextChanged时触发 此行为的作用是遍历VisualTree,并通过确定其直接父对象,将可见性设置为可见或折叠 在初始加载时,每当我向ListView添加/删除ListViewItem时,它都能正常工作 但是,某些交互仅更改绑定到ListViewItem的ViewModel的属性。我要做的是,每当此属性发生更改时,我仍然希望触发仅为该ListViewItem设置可见性的自定义行为。因为DataContext和Loaded不会触发,所以我的行为不会发生 有办法做到这一点吗 这是我的代码供参考: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和
<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();
}
}