2012-06-08 270 views
0

采用了经典的DataTemplate出发:绑定的DataTemplate父项的可见性(可见性或可见性),以在ViewModel

<DataTemplate x:Key="RegularTemplate"> 

    <Grid> 
    ... 
    </Grid> 

</DataTemplate> 

假设正在使用上述模板具有下面的属性呈现的视图模型对象:

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时以某种方式运行。这是一个在滚动过程中隐藏/显示项目的自定义面板,所以我只需要以某种方式绑定到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> 

,但你不能使用datatriggers的方式。

任何想法?

回答

0

当你花2个小时寻找解决方案,放弃,发布在stackoverflow上,5分钟后才发现它,你不讨厌它吗?

答:

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

可以父的可见性绑定到您的视图模型:

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