2010-03-23 3 views
2

내 데이터 바인딩이 올바로 작동하도록 노력하고 있습니다. 나는 내가 성취하려고 노력하는 것이 끝날 수 없다고 믿을만한 이유가 있지만, 나는 우리가 얻는 답을 보게 될 것이다.Silverlight의 DataContext, DataBinding 및 Element Binding

저는 UserControl이 있습니다. 이 UserControl에는 하나 이상의 단추가 포함되어 있습니다. 이제 코드 뒤에 IsBookmarked라는 속성 이름이 있습니다. IsBookmarked가 설정되면 버튼 모양에 애니메이션을 적용하는 코드가 실행됩니다. 아이디어는 버튼을 클릭하면 시각적으로 변경된다는 것입니다. 이 UserControl을 Bookmark 컨트롤이라고 부릅니다.

이제 FormControl이라고하는 다른 컨트롤이 있습니다. 내 FormControl에는 자식 책갈피 컨트롤이 포함되어 있습니다. 내 북마크 컨트롤에서 데이터 바인딩을 시도했지만 작동하지 않습니다. 여기에 도움이되는 몇 가지 코드가 있습니다.

이것은 내 컨트롤의 XAML 및 Loaded 이벤트 처리기입니다. 보시다시피 맞춤 컨트롤 (책갈피) 인 하위 요소가 포함되어 있습니다. 따라서이 컨트롤이로드되면 DataContext는 Employee 객체의 새 인스턴스로 설정됩니다. Silverlight는 또한 내 자식 책갈피 컨트롤의 DataContext 속성을 동일한 인스턴스로 설정합니다. 디버깅을 통해이를 확인했습니다. 부모가 유효한 DataContext를 설정했다면 왜 내 자식 컨트롤 (책갈피) 속성에서 데이터 바인딩을 할 수 없습니까?

<UserControl ......> 
    <q:Bookmark x:Name="BookMarkControl1" IsBookmarked="{Binding IsSiteBookmarked}" /> 
</UserControl> 

public void Control_Loaded(object sender, EventArgs e) 
{ 
    DataContext = new Employee { IsSiteBookmarked = True }; 

} 

다음은 내 사용자 정의 컨트롤입니다. 분명히 이것보다 더 많은 것을 포함하고 있지만 가독성을 위해 나는 데이터 바인딩하려고하는 속성으로 트리밍했습니다. UPDATE

//this is the bookmark control. I've included this control within another control, and I'm trying to databind to properties within my parents DataContext 
public partial class Bookmark : UserControl 
{ 

    bool _IsBookmarked= false; 
    public bool IsBookmarked 
    { 
     get {return _IsBookmarked;} 
     set { 
       _IsBookmarked= value; 
       SwitchMode(value); 
      } 
    } 

} 

내가 언급 할 몇 가지 자바 스크립트 오류를 ​​얻었다. 방화범 정보는 AG_E_PARSER_BAD_PROPERTY_VALUE 예외를보고합니다. 데이터 바인딩이 아직 작동하지 않는 것 같습니다.

+1

'IsBookmarked'는 의존성 속성으로 구현 되었습니까? 또한 코드가 다소 혼란 스럽습니다. Xaml이'IsBookmarked' 속성에 할당하고있는'IsSiteBoolmarked' 속성을 가진'Bookmark '이라는 부분 클래스를 보여줍니다. 'IsSiteBookmarked' 속성은 실제로'Employee'라는 클래스의 속성으로 보입니다. 나는이 질문을 정리하고 좀 더 자세하게 설명 할 필요가 있다고 생각한다. – AnthonyWJones

+0

추가 정보. 희망이 도움이됩니다. – Matt

답변

1

Bookmark 컨트롤에서 IsBookmarked 속성을 사용하여 종속성 속성을 만듭니다.

Control_Loaded가 FormControl의 일부라고 가정합니다.이 경우 DataContext를 올바르게 사용하고 있는지 확실하지 않습니다. 그거 가장 잘 확인해.

업데이트 : 예, DataContext를 올바르게 사용하고 있습니다. AG_E_PARSER_BAD_PROPERTY_VALUE 당신의 IsBookmarked 특성을 종속성 속성을과 같이 필요가 나타냅니다, 당신은 나중에 사용하기 위해 값을 저장해야하는 경우

Public Property IsBookmarked() As Boolean 
    Get 
     Return Me.GetValue(IsBookmarkedProperty) 
    End Get 
    Set(ByVal value As Boolean) 
     Me.SetValue(IsBookmarkedProperty, value) 
    End Set 
End Property 

Public Shared ReadOnly IsBookmarkedProperty As DependencyProperty = DependencyProperty.Register("IsBookmarked", GetType(Boolean), GetType(Bookmark), New PropertyMetadata(New PropertyChangedCallback(AddressOf OnIsBookmarkedPropertyChanged))) 

Private Shared Sub OnIsBookmarkedPropertyChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs) 
    Dim cntrl As Bookmark = TryCast(d, Bookmark) 
    cntrl.SetIsBookmarked(e.NewValue) 
End Sub 

것은, 당신이 OnIsBookmarkedPropertyChanged 절차의 작업을 수행 할 필요가 없습니다하지만, 어쨌든 예제로 몇 가지 코드를 넣었습니다.

행운을 빌어 요!

+0

DependencyProperty를 사용하여 문제가 해결 된 것 같습니다. 더 이상 BAD_PROPERTY 구문 분석 문제가 없습니다. 아직도 Silverlight가 DependencyProperty를 필요로하는 이유가 궁금합니다. 최소한 컴파일 시간 오류가 발생해야합니다. 게시물과 샘플을 보내 주셔서 감사합니다. – Matt

0

일반적으로 개체에 데이터 바인딩을 수행 할 때 INotifyPropertyChanged 인터페이스를 활용하고 컨트롤을 구현하여 컨트롤이 속성 값을 적절히 무효화 할 수 있도록해야합니다. Mode = TwoWay로 INotifyPropertyChanged를 사용하지 않으면 DataContext의 IsSiteBookmarked를 변경하는 코드가 아무 효과가 없습니다.

+0

한 번에 한 단계 씩. 먼저 데이터 바인딩 작업을 수행하고 속성에 대한 알림/업데이트에 대해 걱정할 것입니다. – Matt

1

데이터 바인딩이 평가되는 정확한 순서를 기억하지 못합니다. (너무 가독성이 있습니다.)하지만 이전에 폼의 Loaded 이벤트가 발생하기 전에 발생합니다. IsBookmarked 속성이 종속성 속성이거나 적어도 INotifyPropertyChanged를 사용하면 datacontext를 적절하게 설정하는 데 문제가있을 수 있습니다. INotifyPropertyChanged 구현 또는 IsBookmarked 종속성 속성 만들기를 권하고 싶습니다.데이터 바인딩은 최상의 상황에서 올바르게 작동하기에 충분히 어렵습니다. (내 길고 불쾌한 호언 장담을 here 참조하십시오.) 그리고 당신이 당신의 속성을 방해하지 않으면 스스로 어렵게 만들 것입니다. 기대하는 것.

1

컨트롤은 IsSiteBookmarked 속성을 나타내지 만 (이는 DependencyProperty 여야한다고 생각하지만) 컨트롤은 표시되지 않은 IsBookmarked에 바인딩되어 있습니다. 이것은 의도적입니까? Visual Studio 출력 창에서 바인딩 오류를 확인 했습니까?

추가 1 : 질문에 오타가 수정되어보고되는 오류가 추가되었습니다.

먼저 AG_E_PARSER_BAD_PROPERTY_VALUE 문제를 해결하십시오. 오류 메시지에 줄 번호와 시작 위치가 있습니까? 거기서보기 시작하십시오. 한 가지 전략은 더 이상 오류가 없어 질 때까지 XAML을 가져 오는 것입니다. 이것은 문제가되는 코드의 범위를 좁 힙니다.

디버그 모드에서 실행 중 모드는 출력 창에서 바인딩 오류를 검사합니다.

Employee 클래스 코드, 특히 IsSiteBookmarked 속성도 게시 할 수 있습니다.

+0

내 잘못, 오타가 있었어. 나는 그 질문을 갱신했다. – Matt