2015-04-06 1 views
0

У меня есть некоторый код, как этотКак свернуть Expander всякий раз, когда DataGrid внутри null, используя XAML?

<Expander IsExpanded="{Binding HasData}"> 
    <DataGrid ItemsSource="{Binding SomeDataSource}"> 
     <!-- some sode --> 
    </DataGrid> 
</Expander> 

Сейчас я программная настройка HasData в true всякий раз, когда SomeDataSource установлен на что-то не нулевое.

Можно ли достичь этого, используя только XAML, без кода C#?

+0

Используйте преобразователь в раскрываемый связывания –

+0

Вместо HasData, вы могли бы, вероятно, связать со свойством HasItems в DataGrid и использовать преобразователь, как было предложено выше – failedprogramming

+0

@failedprogramming Что разница? – Will

ответ

1

Вы также можете использовать DataTrigger и сэкономить конвертер.

<Expander> 
    <Style TargetType="{x:Type Expander}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding SomeDataSource, ConverterParameter=SomeData}" Value="{x:Null}"> 
       <Setter Property="IsExpanded" Value="False" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Expander> 
0

Одним из возможных способов заключается в использовании конвертер для привязки к SomeDataSource тоже:

public class IsNullConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (parameter == null) 
      return value == null; 
     else 
      return value != null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 

    #endregion 
} 

Затем, вы можете использовать его в XAML только:

<Window.Resources> 
    <l:IsNullConverter x:Key="IsNullConverter"/> 
</Window.Resources> 

<Expander IsExpanded="{Binding SomeDataSource, Converter={StaticResource IsNullConverter}, ConverterParameter=SomeData}"> 
    <DataGrid ItemsSource="{Binding SomeDataSource}"> 
     <!-- some sode --> 
    </DataGrid> 
</Expander> 

EDIT
Если никаких проблем в вашем случае, вы также можете привязать к свойству DataGrid.HasItems. Он определяет, есть ли элементы в списке источников. Но он также разрушает Expander, когда источник не содержит элементов, но это не null (источник - пустой список).

<Expander IsExpanded="{Binding HasItems, ElementName=dg, Mode=OneWay}"> 
    <DataGrid Name="dg" ItemsSource="{Binding SomeDataSource}"> 
     <!-- some sode --> 
    </DataGrid> 
</Expander> 
0

Использование DataTrigger с ExpanderStyle и привязка к DataGrid сама работает.

<Expander> 
     <Expander.Style> 
      <Style TargetType="{x:Type Expander}"> 
       <Setter Property="IsExpanded" Value="True" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=MyDataGrid, Path=ItemsSource, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}"> 
         <Setter Property="IsExpanded" Value="False" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Expander.Style> 
     <DataGrid x:Name="MyDataGrid" ItemsSource="{Binding SomeDataSource, UpdateSourceTrigger=PropertyChanged}"> 
      <!-- some code --> 
     </DataGrid> 
    </Expander> 
Смежные вопросы