将DataTemplate的父级可见性(IsVisible或Visibility)绑定到ViewModel

时间:2012-06-08 18:26:27

标签: wpf data-binding mvvm datatemplate

从经典的数据模板开始:

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

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

有什么想法吗?

1 个答案:

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