2011-02-22 2 views
13

데이터의 값에 따라 버튼의 스타일을 변경해야한다는 요구 사항이 있습니다. StyleSelector가 완벽하게 작동하지만 버튼을 설정하는 방법이없는 것처럼 보입니다.버튼에 StyleSelector 사용

데이터에서 동적으로 버튼 스타일을 설정하는 방법이 있습니까? 어쩌면 순수한 XAML 방식일까요?

+0

체크 아웃 [이 게시물] (http://stackoverflow.com/questions/3863799/how-to-change-button-template-dynamically-wpf). –

답변

21

당신은이 요구 사항이있는 Button에 대한 다음

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="ButtonStyle1" TargetType="Button"> 
     <Setter Property="Background" Value="Green"/> 
     <Setter Property="FontSize" Value="12"/> 
    </Style> 
    <Style x:Key="ButtonStyle2" TargetType="Button"> 
     <Setter Property="Background" Value="Red"/> 
     <Setter Property="FontSize" Value="14"/> 
    </Style> 
</ResourceDictionary> 

ButtonStyles.xaml를 리소스 사전에 Button 스타일을 배치하고 Button의 스타일을 결합하고 변환기

를 사용할 수 있습니다 당신 관심있는 재산에 Style을 묶는다

<Button ... 
     Style="{Binding Path=MyDataProperty, 
         Converter={StaticResource ButtonStyleConverter}}"/> 

그리고 변환기에 당신은 값

public class ButtonStyleConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Uri resourceLocater = new Uri("/YourNameSpace;component/ButtonStyles.xaml", System.UriKind.Relative); 
     ResourceDictionary resourceDictionary = (ResourceDictionary)Application.LoadComponent(resourceLocater); 
     if (value.ToString() == "Some Value") 
     { 
      return resourceDictionary["ButtonStyle1"] as Style; 
     } 
     return resourceDictionary["ButtonStyle2"] as Style; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

나는이 질문이 오래 전에 물었다는 것을 안다. 하지만 나는 비슷한 것을 성취하려고 노력 중이고 문제를 일으켰다. 이 항목 템플릿을 사용하려면 어떻게해야합니까? 바인딩 된 스타일을 가진 텍스트 상자로 Datatemplate을 작성하십시오. – Daanvl

18

같은 일을 달성하기위한보다 일반적인 방식에 따라 원하는 스타일을 ButtonStyles 리소스 사전을로드하고 반환 :

SomeView.xaml

<UserControl> 
    <UserControl.Resources> 
    <converters:BooleanToStyleConverter x:Key="MyButtonStyleConverter" 
     TrueStyle="{StaticResource AmazingButtonStyle}" 
     FalseStyle="{StaticResource BoringButtonStyle}"/> 
    </UserControl.Resources> 
    <Grid> 
    <Button Style={Binding IsAmazingButton, Converter={StaticResource MyButtonStyleConverter}}/> 
    </Grid> 
</UserControl> 

BooleanToStyleConverter.cs

public class BooleanToStyleConverter : IValueConverter 
{ 
    public Style TrueStyle { get; set; } 
    public Style FalseStyle { get; set; } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is bool && (bool) value) 
     { 
      return TrueStyle; 
     } 
     return FalseStyle; 
    } 

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

이 변환기는 스타일 전환을 제어하기 위해 ViewModel의 부울 속성에 바인딩하는 한 선택한 스타일을 사용하는 모든 종류의 컨트롤을 사용하여 모든보기에서 작동합니다. 다른 바인딩 요구 사항에도 쉽게 적용 할 수 있습니다. 이것은 DataTemplate에서도 잘 작동합니다.

+1

감사합니다. – Artiom

+1

마지막으로, 바운드 데이터를 기반으로 조건부로 스타일을 설정하는 멋지고 단순하며 우아한 방법 - 이렇게 오래 걸릴 수는 없다고 생각합니다. 고맙습니다. –