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

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>

VMオブジェクト:

    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 に答える