2014-12-08 3 views
0

Можно ли установить шаблон управления моего списка с помощью xaml, когда я нажимаю кнопку?Переключить шаблон управления списком при нажатии кнопки

Сейчас я знаю, как установить свой контент-шаблон, когда у меня есть мой ListViewItem, но не как изменить шаблон управления, когда что-то вне списка.

Я хочу изменить мой ListItemTemplate, чтобы использовать RentTemplate или BuyTemplate нажав соответствующую кнопку.

<Button x:Name="RentButton" /> 
    <Button x:Name="BuyButton" /> 

    <ListView Name="ItemsList"> 
     <ListView.Resources> 
      <!-- unselected item template --> 
      <DataTemplate x:Key="DefaultItemTemplate"> 
      </DataTemplate> 
      <!-- selected item template --> 
      <DataTemplate x:Key="SelectedItemTemplate"> 
      </DataTemplate> 
      <DataTemplate x:Key="RentTemplate"> 
      </DataTemplate> 
      <DataTemplate x:Key="BuyTemplate"> 
      </DataTemplate> 
     </ListView.Resources> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="ListBoxItem"> 
       <!-- set properties for all items --> 
       <Setter Property="ContentTemplate" Value="{StaticResource DefaultItemTemplate}" /> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="true"> 
         <!-- change what the selected item looks like --> 
         <Setter Property="ContentTemplate" Value="{StaticResource SelectedItemTemplate}" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </ListView.ItemContainerStyle> 
    </ListView> 

Редактировать

Я пытаюсь использовать DataTriggers, чтобы выбрать, какой шаблон использовать, когда я изменить свойство (которое я изменить, когда я нажимаю на мои кнопки). Я не думаю, что эта ситуация идеальна, но я не знаю другого пути.

Проблема в том, что я не могу смешивать свойства триггеров и DataTriggers в одном и том же MultiTrigger.

Сценарий, который я пытаюсь сделать, следующий: Если я нажму BuyButton, я хочу увидеть BuyTemplate. То же самое для RentButton с RentTemplate. НО, когда я нажимаю третью кнопку OverviewButton Я хотел бы сделать выбор между двумя шаблонами, в зависимости от того, выбран ли текущий ListBoxItem или нет.

Или я неправильно использую DataTemplates и DataTriggers, и есть ли лучший способ достичь этого?

<Window.Resources> 
    <!-- unselected item template --> 
    <DataTemplate x:Key="DefaultItemTemplate"> 
    </DataTemplate> 
    <!-- selected item template --> 
    <DataTemplate x:Key="SelectedItemTemplate"> 
    </DataTemplate> 
    <DataTemplate x:Key="RentTemplate"> 
    </DataTemplate> 
    <DataTemplate x:Key="BuyTemplate"> 
    </DataTemplate> 
    <Style x:Key="ListViewItemStyle" TargetType="{x:Type ListBoxItem}"> 
     <Style.Triggers> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Property="IsSelected" Value="false"/> 
        <Condition Binding="{Binding SelectedType}" Value="Overview" /> 
       </MultiDataTrigger.Conditions> 
       <Setter Property="ContentTemplate" Value="{StaticResource DefaultItemTemplate}" /> 
      </MultiDataTrigger> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Property="IsSelected" Value="true"/> 
        <Condition Binding="{Binding SelectedType}" Value="Overview" /> 
       </MultiDataTrigger.Conditions> 
       <Setter Property="ContentTemplate" Value="{StaticResource SelectedItemTemplate}" /> 
      </MultiDataTrigger> 
      <DataTrigger Binding="{Binding SelectedType}" Value="Rent"> 
       <Setter Property="ContentTemplate" Value="{StaticResource RentTemplate}" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding SelectedType}" Value="Buy"> 
       <Setter Property="ContentTemplate" Value="{StaticResource BuyTemplate}" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
+1

Кажется, что вы ищете 'DataTemplateSelector'. См. Например, этот учебник: http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector –

+1

@FlatEric: Я бы опубликовал это как ответ с примером использования. –

ответ

0

я в конечном итоге решил так:

<Style x:Key="OverviewListViewItemStyle" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="ContentTemplate" Value="{StaticResource DefaultItemTemplate}" /> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="true"> 
       <Setter Property="ContentTemplate" Value="{StaticResource SelectedItemTemplate}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
    <Style x:Key="BuyListViewItemStyle" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="ContentTemplate" Value="{StaticResource BuyTemplate}" /> 
    </Style> 
    <Style x:Key="RentListViewItemStyle" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="ContentTemplate" Value="{StaticResource RentTemplate}" /> 
    </Style> 

И просто делать это, на мой взгляд:

private void RentButton_Click(object sender, RoutedEventArgs e) 
    { 
     ItemsList.ItemContainerStyle = (System.Windows.Style)Resources["RentListViewItemStyle"]; 
     _MainWindowViewModel.RentButton_Click(); 
    } 

    private void BuyButton_Click(object sender, RoutedEventArgs e) 
    { 
     ItemsList.ItemContainerStyle = (System.Windows.Style)Resources["BuyListViewItemStyle"]; 
     _MainWindowViewModel.BuyButton_Click(); 
    } 

    private void PropertyButton_Click(object sender, RoutedEventArgs e) 
    { 
     ItemsList.ItemContainerStyle = (System.Windows.Style)Resources["OverviewListViewItemStyle"]; 
     _MainWindowViewModel.PropertyButton_Click(); 
    } 

Это был самый простой способ для переключения стилей, не теряя слишком много времени выясняя из правильной комбинации вуду и триггеров.

2

Вы можете использовать DataTemplateSelector.
Учебника можно найти здесь: http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector

Некоторый код из учебника:

public class ImgStringTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate ImageTemplate { get; set; } 
    public DataTemplate StringTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, 
     DependencyObject container) 
    { 
     String path = (string)item; 
     String ext = System.IO.Path.GetExtension(path); 
     if (System.IO.File.Exists(path) && ext == ".jpg") 
      return ImageTemplate; 
     return StringTemplate; 
    } 
} 

XAML:

<Window.Resources> 
    <local:RelativeToAbsolutePathConverter x:Key="relToAbsPathConverter" /> 

    <DataTemplate x:Key="stringTemplate"> 
     <TextBlock Text="{Binding}"/> 
    </DataTemplate> 

    <DataTemplate x:Key="imageTemplate"> 
     <Image Source="{Binding Converter={StaticResource relToAbsPathConverter}}" 
      Stretch="UniformToFill" Width="200"/> 
    </DataTemplate> 

    <local:ImgStringTemplateSelector 
     ImageTemplate="{StaticResource imageTemplate}" 
     StringTemplate="{StaticResource stringTemplate}" 
     x:Key="imgStringTemplateSelector" /> 
</Window.Resources> 

<ListView ScrollViewer.CanContentScroll="False" 
      ItemsSource="{Binding ElementName=This, Path=PathCollection}" 
      ItemTemplateSelector="{StaticResource imgStringTemplateSelector}"> 
</ListView> 

шаблонов и селектор может быть specidifed в ресурсах, Затем управление должно ссылаться на DataTemplateSelector.

+0

Как использовать кнопку мыши для изменения выбранного шаблона? Я прочитал [в другом ответе] (http://stackoverflow.com/a/2089272/1653998), что выбор шаблона - это событие, которое происходит только один раз. –

+0

Возможно, это сообщение решит вашу проблему: http://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes –

+0

Эрик, я пробовал применить эти предложения и отредактировал мой вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^