2012-07-20 67 views
0

如果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和图像可以单独得到折叠。如果两者都折叠,我需要DataGridRow折叠或隐藏,所以你不会在网格中看到它。我的计划是定义一个名为'DataGridRowStyle'的RowStyle。样式将由TextBlock和Images的Visibility属性触发,并将RowStyle的可见性设置为折叠状态。

<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元素进行fint操作。我想你不能绑定到DataTemplate,或者我做错了什么?我能以某种方式做同样的事情吗?

+0

你想,当用户选择它,倒塌像做你的行扩展当一行 – ethicallogics 2012-07-20 07:31:32

回答

1

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

我会做它的其他方式:

  1. 在我看来,你应该能够确定你的ItemViewModel如果文本框和图像都崩溃了在同一时间
  2. 添加一个属性到你的ItemViewModel(例如'VisibilityProperty'),并且在TextBox和Image都折叠时将它设置为'Collapsed'。
  3. 通过RowStyle将DataGridRow的VisibilityProperty绑定到您的ItemViewModel的此属性。

这应该这样做

编辑: 如果你不能改变你的itemViewModel,你有其他选择(相当难看虽然):

结合该行的可见性,以项目本身和使用转换器来查找项目的子项并查看它们是否在运行时崩溃。

类似的规定:

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

和你的转换器的代码,你有明显的项目,所以只是看文本框的视图模型和图片的视图模型,看看他们是否会崩溃的图片&文本框,然后返回因此,可见性:

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(); 
    } 
} 
+0

我的问题用户点击是,我不能改变下躺在ItemModelView。但是你回答了我的担忧,所以谢谢。为了实现这个目标,我将不得不进行一些重新设计。 – user1538142 2012-07-20 07:33:41

+0

请参阅我的编辑答案,了解您的案例中的解决方法,可能有所帮助。 – David 2012-07-20 07:47:58

+0

嗨大卫。不是一个坏主意,谢谢。很有用。 – user1538142 2012-07-20 07:51:48

相关问题