2012-07-20 66 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

相關問題