从经典的数据模板开始:
<DataTemplate x:Key="RegularTemplate">
<Grid>
...
</Grid>
</DataTemplate>
假设使用上述模板呈现的ViewModel对象具有以下属性:
private Visibility _Visibility;
public Visibility VMVisibility
{
set
{
if (value == _Visibility) return;
_Visibility = value;
if (value == System.Windows.Visibility.Visible)
{
ViewRefresher.TwentySecondsTick += Tick;
}
else
{
ViewRefresher.TwentySecondsTick -= Tick;
}
}
private get
{
return _Visibility;
}
}
我希望在包含它的面板不呈现listboxitem时以某种方式运行setter代码。它是一个自定义面板,在滚动过程中隐藏/显示项目,所以我只需要以某种方式绑定到listboxitems的可见性。
我尝试了以下方面的内容:
<DataTemplate x:Key="RegularTemplate">
<Grid>
...
</Grid>
<DataTrigger Binding="{Binding IsVisible,RelativeSource=
{RelativeSource FindAncestor,
AncestorType={x:Type ListBoxItem}}}" Value="False">
<Setter Property="{Binding VMVisibility}" Value="False"/>
</DataTrigger>
</DataTemplate>
但你不能那样使用数据触发器。
有什么想法吗?
答案 0 :(得分:0)
当你花2个小时寻找解决方案,放弃,在stackoverflow上发帖,只是在5分钟后找到它时,你不讨厌它吗?
答案:
使用这个人的行为:https://stackoverflow.com/a/3667609/855551
您可以将父级的isVisible绑定到viewmodel:
<DataTemplate x:Key="RegularTemplate">
<Grid>
<behaviour:DataPiping.DataPipes>
<behaviour:DataPipeCollection>
<behaviour:DataPipe Source="{Binding RelativeSource=
{RelativeSource AncestorType={x:Type ListBoxItem}},
Path=IsVisible}"
Target="{Binding Path=Visible, Mode=OneWayToSource}"/>
</behaviour:DataPipeCollection>
</behaviour:DataPiping.DataPipes>
...
</Grid>
</DataTemplate>
VM对象:
private bool _Visible;
public bool Visible
{
set
{
if (value == _Visible) return;
_Visible = value;
if (value == true)
EnableRefresh();
else
DisableRefresh();
}
private get
{
return _Visible;
}
}