1

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にバインドできないと思いますが、どうすればよいですか?どういうわけか同じことを別の方法で行うことはできますか?

4

1 に答える 1

1

RowStyleのスコープ外であるため、ここでdataTemplateにバインドすることはできません。

私は他の方法でそれを行います:

  1. ご覧のとおり、ItemViewModelで、TextBoxと画像の両方が同時に折りたたまれているかどうかを判断できるはずです。
  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>

コンバーターのコードには明らかにアイテムがあるので、TextBoxのViewModelとImageのViewmodelを探して、それらがImageとTextBoxを折りたたむかどうかを確認し、それに応じてVisibilityを返します。

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();
    }
}
于 2012-07-20T07:17:58.300 に答える