2011-04-13 2 views
4

wpf 응용 프로그램이 처음로드 될 때 if 조건에 따라 단추의 스타일을 변경하고 싶습니다. if를 사용하여로드 된 애플리케이션에서 버튼의 한 스타일이 있고 다른 버튼의 스타일이있을 것입니다. Datatriggers 또는 MVVM 패턴을 사용하여이를 달성하는 방법.wpf mvvm에서 DataTriggers를 사용하는 경우를 기반으로 버튼 스타일을 변경하는 방법

친절히 제안 하시겠습니까?

감사합니다.

답변

2

데이터 템플릿과 템플릿 선택기를 살펴보아야합니다. 여기에 내 코드에서 급하게 붙여 넣은 예제가 있습니다. 버튼에 즉시 적용 할 수는 없지만, 그 방법으로 당신을 도울 것입니다.

다음은 응용 프로그램 자원 xaml 파일의 내용입니다. 다음과 같이

<DataTemplate DataType="{x:Type viewmod:ProjectViewModel}"> 
    <DataTemplate.Resources> 
     <DataTemplate x:Key="ProjectEditViewTemplate"> 
      <view:ProjectEditView/> 
     </DataTemplate> 
     <DataTemplate x:Key="ServiceSelectionViewTemplate"> 
      <view:ServiceSelectionView/> 
     </DataTemplate> 
    </DataTemplate.Resources> 
    <ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource ProjectViewModelTemplateSelector}" /> 
</DataTemplate> 

ProjectViewModelTemplateSelector가 정의 :

public class ProjectViewModelTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     FrameworkElement element = container as FrameworkElement; 

     if (element != null && item != null && item is ViewModel.ProjectViewModel) 
     { 
      if ((item as ViewModel.ProjectViewModel).EditMode) 
      { 
       return element.FindResource("ProjectEditViewTemplate") as DataTemplate; 
      } 
      else 
      { 
       return element.FindResource("ServiceSelectionViewTemplate") as DataTemplate; 
      } 

     } 
     else 
      return base.SelectTemplate(item, container); 
    } 

} 

}

+0

도움 주셔서 감사합니다. – Tarun

2

을 다른 방법으로, 만약 내가 뷰 모델의 변수에 따라 ProjectViewModel에 사용할보기를 결정하는 데 사용 DataTriggers를 사용하려면 다음을 사용할 수 있습니다.

 <Button Command="{Binding SomeButtonCommand}" Content="Click Me!"> 
     <Button.Style> 
      <Style TargetType="{x:Type Button}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=NormalButtonMode, Mode=OneWay}" Value="True"> 
         <Setter Property="Content" Value="This Button is in Normal Mode" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=NormalButtonMode, Mode=OneWay}" Value="False"> 
         <Setter Property="Content" Value="This Button is in the Other Mode" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
    </Button> 

그의 경우 ViewModel은 부울 속성 NormalButtonMode를 노출해야합니다. 이 예제에서는 버튼의 Content 속성 만 설정했지만 DataTrigger 내부에는 여러 Setter를 나열 할 수 있습니다. 이 스타일을 리소스 사전에 넣고 StaticResource를 사용하여 각 버튼에 링크 할 수도 있습니다. 그냥 각 ViewModel에 NormalButtonMode (또는 무엇이든) 속성을 노출시켜야합니다. 기본 클래스에 넣을 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 스타일을 변경하려면 if else 조건을 사용하여 응용 프로그램을로드 할 때 이미지를 변경하고 싶다는 의미입니다. xaml은 다음과 같습니다 :

+0

그것은 효과가있다. 나는 나의 필요에 따라 그것을 바꿨다. 감사합니다 – Tarun

6

Style.Setters을 사용하여 기본값을 설정할 수 있습니다. 다른 결정된 조건의 경우 Style.Triggers을 사용하십시오. 다른 경우처럼 작동합니다.

<TextBlock.Style> 
    <Style TargetType="TextBlock"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=EditorWindow, Path=Category}" Value="R"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
     <Style.Setters> 
      <Setter Property="Visibility" Value="Collapsed"/> 
     </Style.Setters> 
    </Style> 
</TextBlock.Style> 
+0

이것은 내가 검색하는 것입니다. 감사! – psulek

관련 문제