WPF: как я могу получить текущий наследник ListView из DataTemplate - PullRequest
0 голосов
/ 12 июля 2011

У меня есть 2 наследника ListView:

    public class FileListView : ListView
    public class ThumbnailListView : ListView

В XAML у меня есть следующий код:

    <Window.Resources>
        <DataTemplate x:Key="FileListViewTemplate">
          <dtc:FileListView/>
        </DataTemplate>
        <DataTemplate x:Key="ThumbnailViewTemplate">
          <dtc:ThumbnailView/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
      <CheckBox x:Name="MyCheckBox">
      <ContentControl x:Name="MyContentControl" MouseDown="OnContentControlMouseDown">
        <DataTemplate>
          <ContentPresenter x:Name="AudioPresenter" 
                            ContentTemplate="{StaticResource FileListTemplate}"/>
          <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding ElementName=MyCheckBox, Path=IsChecked}"
                         Value="true">
              <Setter TargetName="AudioPresenter"
                      Property="ContentTemplate"
                      Value="{StaticResource ThumbnailViewTemplate}" />
            </DataTrigger>
          </DataTemplate.Triggers>
        </DataTemplate>
      </ContentControl>
    </Grid>

В коде позади:

     public ListView GetCurrentListView()
    {
        ListView lv = null;
        DataTemplate fileListViewTemplate = base.FindResource("FileListViewTemplate") 
                                            as DataTemplate;
        DataTemplate thumbnailViewTemplate = base.FindResource("ThumbnailViewTemplate") 
                                           as DataTemplate;

        ContentPresenter contentPresenter = VisualTreeHelper.GetChild(this.MyContentControl, 0)
            as ContentPresenter;
        try
        {
            lv = fileListViewTemplate.FindName("FileListView", contentPresenter)
            as ListView;
        }
        catch (Exception)
        {
            lv = thumbnailViewTemplate.FindName("ThumbnailView", contentPresenter)
            as ListView;
        }
        return lv;
     }

Если отмечен CheckBox, я хочу увидеть ThumbnailView, иначе я хочу увидеть FileListView. И иногда я хочу получить текущий вид списка из кода позади. Что я делаю не так?

1 Ответ

0 голосов
/ 12 июля 2011

Может быть, вы должны использовать конвертер для преобразования "true" из строки в bool, когда вы указываете Value в вашем DataTrigger?

    public sealed class StringToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var flag = false;
        if (value is bool)
            flag = (bool)value;
        else
            if (value is bool?)
            {
                var nullable = (bool?)value;
                flag = nullable.GetValueOrDefault();
            }
        return flag;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var back = ((value is String) && (((String)value) == "true"));
        return back;
    }
}
...