【问题标题】:Bind DataTemplate's parent's visibility (IsVisible or Visibility) to the ViewModel将 DataTemplate 父可见性(Is Visible 或 Visibility)绑定到 ViewModel
【发布时间】:2012-06-08 18:26:27
【问题描述】:

从经典数据模板开始:

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

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

有什么想法吗?

【问题讨论】:

    标签: wpf data-binding mvvm datatemplate


    【解决方案1】:

    你不讨厌花 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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2022-10-19
      • 1970-01-01
      • 2016-12-08
      • 2021-05-21
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2011-10-23
      • 2010-11-23
      相关资源
      最近更新 更多