2012-06-08 183 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; 
     } 
    }