0

从经典数据模板开始:

<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;
        }
    }

我希望该 setter 代码在包含它的面板未呈现 listboxitem 时以某种方式运行。这是一个自定义面板,在滚动过程中隐藏/显示项目,所以我只需要以某种方式绑定到列表框项目的可见性。

我已经尝试过以下内容:

<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>

但你不能那样使用数据触发器。

有任何想法吗?

4

1 回答 1

0

当您花费 2 小时寻找解决方案、放弃、在 stackoverflow 上发帖,却在 5 分钟后找到它时,您不讨厌它吗?

回答:

使用这家伙的行为:https ://stackoverflow.com/a/3667609/855551

您可以将父级的 isVisible 绑定到您的视图模型:

<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>

虚拟机对象:

    private bool _Visible;
    public bool Visible
    {
        set
        {
            if (value == _Visible) return;
            _Visible = value;
            if (value == true)
                EnableRefresh();
            else
                DisableRefresh();
        }

        private get
        {
            return _Visible;
        }
    }
于 2012-06-08T19:07:48.250 回答