如何将parent属性绑定到子元素datatemplate

时间:2012-07-20 07:09:24

标签: wpf binding datagrid datatemplate multidatatrigger

如果DataGrids通过转换器,我需要将DataGrid的RowStyle属性绑定到Visibility。问题是孩子们存在于DataTemplate中。我下面的代码是我现在正在做的简化版本,所以它可能没那么重要。但无论如何:

<DataGrid Name="dataGrid"
              ItemsSource="{Binding Path=ListOfData}"
              RowStyle="{StaticResource DataGridRowStyle}"
              >
        <DataGrid.RowDetailsTemplate>
              <DataTemplate>
                    <StackPanel>
                         <TextBlock Name="textBlock" Source={Binding Path=Title}
                         <Image Name="image" Source="{Binding Path=Image}"/>
                    </StackPanel>
              </DataTemplate>
        </DataGrid.RowDetailsTemplate>
  </DataGrid>

问题是,TextBlock和Image可以单独折叠。如果两者都折叠,我需要DataGridRow折叠或隐藏,这样你就不会在网格中看到它。我的计划是定义一个名为'DataGridRowStyle'的RowStyle。样式将由TextBlock和Images的Visibility属性触发,并将RowStyle的Visibility设置为折叠。

  <Style TargetType="{x:Type DataGridRow}" x:Key="DataGridRowStyle">
    <Setter Property="Visibility" Value="Visible" />
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Value="True">
                    <Condition.Binding>
                        <MultiBinding Converter="{StaticResource VisibilityConverter}">
                            <Binding ElementName="textBlock" Path="Visibility" />
                            <Binding ElementName="image" Path="Visibility" />
                        </MultiBinding>
                    </Condition.Binding>
                </Condition>
            </MultiDataTrigger.Conditions>
            <Setter Property="Visibility"  Value="Collapsed"/>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

不幸的是,我在运行时收到警告,其中System.Data无法伪造我的textBlock或image元素。我想你不能绑定到DataTemplate或我做错了什么?我可以以某种方式做同样的事情吗?

1 个答案:

答案 0 :(得分:1)

你确实无法在这里绑定到你的dataTemplate,因为它超出了RowStyle的范围。

我会以其他方式这样做:

  1. 在我看来,你应该能够在你的ItemViewModel中确定TextBox和图像是否同时折叠
  2. 向ItemViewModel添加一个属性(例如'VisibilityProperty'),并在TextBox和Image折叠时将其设置为'Collapsed'。
  3. 通过RowStyle将DataGridRow的VisibilityProperty绑定到ItemViewModel的此属性。
  4. 这应该做到

    修改 如果你不能改变你的itemViewModel,你还有另一个选择(虽然很难看):

    将Row的Visibility绑定到Item本身,并使用转换器查找items子项,并查看它们是否在运行时折叠。

    沿着这些方向:

    <Style TargetType="{x:Type DataGridRow}" x:Key="DataGridRowStyle">
        <Setter Property="Visibility" Value="{Binding Converter=MyRowViewModelToVisibilityconverter}" />
    </Style>
    

    你的转换器代码显然你有这个项目,所以只需查看TextBox的ViewModel和Image的Viewmodel,看看它们是否会折叠Image&amp; TextBox,然后返回可见性:

    public class MyRowViewModelToVisibilityconverter: MarkupExtension, IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var item = value as ItemViewModel;
            bool isImageCollapsed = false, isTextBoxCollapsed = false;
    
            // Look into your ItemViewModel for the properties inducing a Visibility=Collapsed on the Image and the TextBox
    
            return (isImageCollapsed && isTextBoxCollapsed) ? Visibility.Collapsed : Visbility.Visible;
    
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return new MyRowViewModelToVisibilityconverter();
        }
    }