2016-10-24 2 views
2

버튼을 컨트롤 템플릿에 바인딩해야합니다. (그것이 문자열이 될 수 있도록 정수,하지만 행복)컨트롤 템플릿에 바인딩하기

Button Template="{Binding Status, Converter={StaticResource StatustoTemplate}}" 

컨버터 (StatustoTemplate)이 상태로 잘 실행 변경 :

public class StatustoTemplate : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 

     { 
      if (value==1) 
      { 
       return ControlTemplateName1; 
      } 
      if (value==2) 
      { 
       return ControlTemplateName2; 
      } 
     } 
} 

XAML은 다음과 같이 보입니다 이제 어떤 형식으로 다시 보낼 수 있습니까? ControlTemplate1 또는 ControlTemplate2? ContentTemplate1ControlTemplate2은 XAML에 정의 된대로 유효한 컨트롤 템플릿이라고 가정합니다. ControlTemplate을 반환해야하지만 이제는 어떻게 설정해야합니까?

답변

0

XAML에서 정의 된 리소스를 변환기에서 쉽게 찾을 수 없습니다. 나는 보통 두 정의가있는 하나의 제어 템플릿을 정의하고 Visibility을 사용하여 전환합니다. 코드는 간단한 샘플 일뿐입니다.

XAML

<Window> 
    <Window.DataContext> 
     <local:MainWindowViewModel/> 
    </Window.DataContext> 
    <Window.Resources> 
     <ResourceDictionary> 
      <local:MyConverter x:Key="MyConverter"/> 
      <ControlTemplate x:Key="template"> 
       <Grid> 
        <Grid Visibility="{Binding Status, Converter={StaticResource MyConverter}, ConverterParameter=1}"> 
         <TextBox Text="1"/> 
        </Grid> 
        <Grid Visibility="{Binding Status, Converter={StaticResource MyConverter}, ConverterParameter=2}"> 
         <TextBox Text="2"/> 
        </Grid> 
       </Grid> 
      </ControlTemplate> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <Button Template="{StaticResource template}"/> 
    </Grid> 
</Window> 

변환기

public class MyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((string)parameter == "1") ? Visibility.Visible : Visibility.Collapsed; 
    } 

    // ConvertBack 
} 
0

나는 당신을 위해 일 수있는 MarkupExtension 있습니다. xaml이 Resources에 의해 ResourceKey에 의해 정의되고 있습니다.

첫째 : 추상 클래스 StyleRefExtension :

public abstract class StyleRefExtension : MarkupExtension 
{ 
    protected static ResourceDictionary RD; 
    public string ResourceKey { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return ProvideValue(); 
    } 

    public object ProvideValue() 
    { 
     if (RD == null) 
      throw new Exception(
       @"You should define RD before usage. 
      Please make it in static constructor of extending class!"); 
     return RD[ResourceKey]; 
    } 
} 

둘째 : StyleRefExt

public class StyleRefExt : StyleRefExtension 
{ 
    static StyleRefExt() 
    { 
     RD = new ResourceDictionary 
      { 
       Source = new Uri("pack://application:,,,/##YOUR_ASSEMBLYNAME##;component/Styles/##YOUR_RESOURCE_DICTIONARY_FILE##.xaml") 
      }; 
    } 
} 

클래스 구현 그냥 어셈블리의 이름으로 ## YOUR_ASSEMBLYNAME ##를 교체 ## YOUR_RESOURCE_DICTIONARY_FILE ##의 파일 이름 r ResourceDictionary (폴더 Styles에 있음).

귀하의 Converter 다음과 같아야합니다

컨버터 다음
<Style TargetType="Button" x:Key="StatusButton"> <!--set BasedOn if there is a base Style--> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Status}" Value="1"> 
      <Setter Property="Template" Value="{StaticResource ControlTemplateName1}"/> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding Status}" Value="2"> 
      <Setter Property="Template" Value="{StaticResource ControlTemplateName2}"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

이 스타일 적용하지 않고 내 선호 된 접근이 템플릿을 전환 DataTriggers와 스타일을 사용하는 것입니다
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    if (value==1) { 
     StyleRefExt sr = new StyleRefExt {ResourceKey = "ControlTemplateName1"}; 
     return sr.ProvideValue(); 
    } 
    if (value==2) { 
     StyleRefExt sr = new StyleRefExt {ResourceKey = "ControlTemplateName2"}; 
     return sr.ProvideValue(); 
    } 
} 
0

:

<Button Style="{StaticResource StatusButton}"/> 
관련 문제