2014-12-08 1 views
0

버튼을 클릭하면 xaml로 내 listview의 컨트롤 템플릿을 설정할 수 있습니까?버튼을 클릭했을 때 listview의 컨트롤 템플릿을 바꿀 수 있습니다.

지금 내 ListViewItem을 선택했을 때 내 contenttemplate을 설정하는 방법을 알고 있지만 목록 뷰 바깥에있는 내용이 변경되면 내 제어 템플릿을 변경하는 방법을 알지 못합니다.

해당 버튼을 클릭 할 때 RentTemplate 또는 BuyTemplate을 사용하도록 ListItemTemplate을 변경하고 싶습니다.

<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를 사용하기 위해 노력하고있어

편집. 나는이 상황이 이상적이라고 생각하지 않지만, 다른 어떤 방법을 모른다.

이제 문제는 동일한 MultiTrigger에서 Property 트리거와 DataTriggers를 혼합 할 수 없다는 것입니다.

내가 만들려고하는 시나리오는 다음과 같습니다. 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

나는 결국 이런 식으로 해결했습니다 부두와 트리거의 올바른 조합을

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를 참조해야합니다.

<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(); 
    } 

+0

버튼을 클릭하여 선택한 템플릿을 어떻게 변경합니까? 나는 [다른 대답] (http://stackoverflow.com/a/2089272/1653998)에서 템플릿을 선택하는 것은 한 번만 발생하는 이벤트임을 읽었습니다. –

+0

어쩌면이 게시물은 문제를 해결할 것입니다 : http://stackoverflow.com/questions/8715315/how-to-trigger-datatemplateselector-when-property-changes –

+0

에릭, 나는 그 제안을 적용 해보고 내 질문을 편집했습니다. –

관련 문제