2011-11-28 5 views
0

문제 설명 : 내 Silverlight 응용 프로그램 (4.0)에 백그라운드가 일부 원본 속성에 바인딩 된 TextBox 컨트롤이 있습니다. TextBox 컨트롤에 대한 동작을 만들었습니다. 내 행동 내부에서 나는 그 구속력을 지니고 다른 목표로 방향을 바꾼다. 즉, TextBox 컨트롤에서 속성을 업데이트하는 대신 백그라운드 바인딩의 source 속성이 변경되면 다른 대상 속성을 업데이트하려고합니다. 그렇게하는 방법? 나는 반사를 시도했지만 사적인 영역의 SL에서는 허용되지 않았습니다 ...바인딩 대상 바꾸기 (silverlight 4.0)

미리 감사드립니다.

답변

0

"리디렉션"을 원하는 이유가 확실하지 않습니다. 텍스트 상자의 텍스트가 바뀌어도 여전히 괜찮습니까? , 당신이 우리 수 TextChanged 이벤트 행동에

<StackPanel> 
<TextBox x:Name="tb1" /> 
<TextBox Text="{Binding ElementName=tb1, Source=Text}" /> 
</StackPanel> 

하고 캡처 : 화면의 다른 요소에 결합하는 것을 시도하는 경우 요소가 TB1 텍스트 상자가 포커스를 잃었을 이후에 발생하는 것이라고 바인딩 사용할 수 있습니다 그곳에.

public class TextBoxBehavior : Behavior<TextBox> 
{ 
/// <summary> 
/// Called after the Behavior is attached to an AssociatedObject. 
/// </summary> 
/// <remarks>Override this to hook up functionality to the AssociatedObject.</remarks> 
protected override void OnAttached() 
{ 
base.OnAttached(); 
this.AssociatedObject.TextChanged += new TextChangedEventHandler(AssociatedObject_TextChanged); 
} 

/// <summary> 
/// Called after the Behavior is detached from an AssociatedObject. 
/// </summary> 
/// <remarks>Override this to hook up functionality to the AssociatedObject.</remarks> 
protected override void OnDetaching() 
{ 
base.OnDetaching(); 
this.AssociatedObject.TextChanged -= new TextChangedEventHandler(AssociatedObject_TextChanged); 
} 

void AssociatedObject_TextChanged(object sender, TextChangedEventArgs e) 
{ 
if(!string.IsNullOrEmpty(this.AssociatedObject.Text)) 
{ 
string enteredValue = this.AssociatedObject.Text; 
// do what you want with the entered value 
} 

// if you want to reset it.. this.AssociatedObject.Text = string.Empty; 
} 
} 
+0

정렬 할 대상 : 저는 XAML을 제어 할 수 없습니다. 나는 TextBox에 영향을 줄 수있는 Behavior를 개발하려고 노력했다. 예를 들어, XAML 내부의 사용자가 TextBox의 배경에 바인딩을 설정합니다. 그러나 그가 내 행동을 적용한 후에 나는 (행동의 내부에서) 그 배경을 가지고 다른 것으로 바꾸기를 원한다. (나는 다른 브러시로 원래 배경을 채우고 싶다.) 바운드 DependencyProperty에서 현재 값을 추출하는 방법을 알게되면 승리의 절반 단계가됩니다.나는 GetValue를 사용하려고 시도했다. 아무것도 반환하지 않는다. – Illidan

1

당신은 FrameworkElement.GetBindingExpression를 사용하여 기존의 Binding를 얻을 수 있습니다. 다음은 샘플입니다 :

FrameworkElement yourControl = null; // the code to get the control goes here 
BindingExpression bindingExpression = 
    yourControl.GetBindingExpression(TextBox.Background); 
Binding binding = bindingExpression.ParentBinding; // it's your binding 

그런 다음, 설정, 속성 (필요한 경우 변경 대상을) 새로운 Binding 객체를 생성하고이를 연결하는 SetBinding를 사용합니다.

UPDATE 바인딩 소스에 대한 지금

.

이 속성을 명시 적으로 설정 한 경우에만 Source 속성이 null이 아닌 것에 유의하십시오. Binding 소스

다른 옵션 포함

  1. 특정 요소 : Binding.RelativeSourceRelativeSource
  2. Mode=RelativeSourceMode.TemplatedParent 바인딩 대상 제어로 설정된 경우 사용했을 Binding.ElementName 속성
  3. 템플릿 제어를 설정하는 경우에 사용 : Binding.RelativeSource이 으로 설정된 경우 사용 Mode=RelativeSourceMode.TemplatedParent
  4. DataContext : Source, 이전 3 옵션이 적용되지 않습니다.

을 복제하려면 이러한 옵션을 모두 확인해야합니다.

그러나 데이터 항목 만 있으면 BindingExpression.DataItem 속성을 사용하는 것이 좋으며 바인딩 소스 인 실제 데이터 항목을 반환해야합니다.

+0

파벨에게 : 나는 그것을 시도했지만 어떤 이유로 반환 된 바인딩의 "소스"가 null입니다. 이 바인딩을 재사용하거나이를 기반으로 다른 바인딩을 빌드하는 것을 방지합니다 ... 그런데 반환 된 바인딩의 경로는 완벽하게 보입니다. – Illidan

+0

@Illidan 제발, 내 업데이트 된 답변을 확인하십시오. –

+0

BindingExpression.DataItem은 나머지 속성과 마찬가지로 null입니다. Silverlight 4에 대한 답을 테스트 했습니까? – Illidan