2014-10-17 3 views
1

부울 변수가 true 일 때 레이블 및 단추의 배경을 변경해야합니다 (false로 설정된 기본 색으로 되돌림). 그래서 나는 첨부 된 속성을 썼다.WPF에서 연결된 속성이있는 컨트롤의 배경 변경

public class BackgroundChanger : DependencyObject 
{ 
    #region dependency properties 
    // status 
    public static bool GetStatus(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(StatusProperty); 
    } 
    public static void SetStatus(DependencyObject obj, bool value) 
    { 
     obj.SetValue(StatusProperty, value); 
    } 
    public static readonly DependencyProperty StatusProperty = DependencyProperty.RegisterAttached("Status", 
        typeof(bool), typeof(BackgroundChanger), new UIPropertyMetadata(false, OnStatusChange)); 

    #endregion 

    private static void OnStatusChange(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     var element = obj as Control; 
     if (element != null) 
     { 
      if ((bool)e.NewValue) 
       element.Background = Brushes.LimeGreen; 
      else 
       element.Background = default(Brush); 
     } 
    } 
} 

을하고 난 다음과 같이 사용 : 그것은 지금까지 다음과 같습니다

<Label CustomControls:BackgroundChanger.Status="{Binding test}" /> 

가 잘 작동합니다. 해당 변수 test이 뷰 모델에 설정되면 배경색이 LimeGreen으로 변경됩니다.

내 질문 :

색상 LimeGreen가 하드 코딩되어있다. XAML에서 그 색상 (및 기본 색상뿐 아니라)을 설정하고 싶습니다. 그래서 두 가지 색상이 배경을 전환하는 것을 결정할 수 있습니다. 내가 어떻게 할 수 있니?

+0

모양을? 또는'Status'를'Brush' 타입으로 만드시겠습니까? – Sinatr

+0

나는 하나의 (광석 2 개) 더 많은 속성을 만드는 데 어려움을 겪고있다. 'OnStatusChanged'에서 어떻게 사용합니까? –

답변

1

첨부 된 속성을 여러 개 가질 수 있습니다. 액세스 방법은 간단합니다. 고정 Get..Set.. 방법이 있으며 여기에는 조작하려는 속성 값을 첨부 한 DependencyObject을 제공합니다.

XAML에서
public class BackgroundChanger : DependencyObject 
{ 
    // make property Brush Background 
    // type "propdp", press "tab" and complete filling 

    private static void OnStatusChange(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     var element = obj as Control; 
     if (element != null) 
     { 
      if ((bool)e.NewValue) 
       element.Background = GetBrush(obj); // getting another attached property value 
      else 
       element.Background = default(Brush); 
     } 
    } 
} 

얼마나`Status`에 해당하는 경우 색상을 지정하는 또 하나 개의 연결된 속성을 사용하는 방법에 대한

<Label CustomControls:BackgroundChanger.Status="{Binding test}" 
    CustomControls:BackgroundChanger.Background="Red"/> 
+0

괜찮습니다. 하지만 어떻게 xaml보기에서 이러한 속성을 지금 설정합니까? –

0

대신 DataTrigger를 사용하지 않는 이유는 무엇입니까?

<Style x:Key="FilePathStyle" TargetType="TextBox"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding ElementName=AddButton, Path=IsEnabled}" Value="True"> 
      <Setter Property="Background" Value="#FFEBF7E1" /> 
     </DataTrigger> 

     <DataTrigger Binding="{Binding ElementName=AddButton, Path=IsEnabled}" Value="False"> 
      <Setter Property="Background" Value="LightYellow" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

. 
. 
. 
<TextBox Style="{StaticResource FilePathStyle}" x:Name="filePathControl" Width="300" Height="25" Margin="5" Text="{Binding SelectedFilePath}" /> 
+0

순간에 나는 datatrigger와 함께 일하고있다. 모든 컨트롤에이 모든 라인을 쓰려면 그 기능이 필요합니까? –

+0

나는 약간 혼란 스럽다. 이러한 컨트롤은 모두 한 곳 (즉, 스타일)에서 행동을 유도 할 수있는 스타일을 활용합니다. –