2013-03-23 2 views
0

중 하나가 내가 데이터 트리거가 이런 식으로 정의되어있을 때 UI를 통지하는 방법 :뷰 모델의 객체 바인딩 - 그 속성 변경

<DataTrigger Binding="{Binding Path=DataContext.MyObject.MyProperty, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False"> 
    <Setter Property="IsEnabled" Value="False" /> 
</DataTrigger> 

을 MyObject가보기 모델입니다. 이제, MyProperty가 OnPropertyChange를 통보하더라도 MyObject의 MyProperty가 변경되면 UI에 통지하지 않습니다. 프레임 워크로 Microsoft Prism을 사용함에 따라 MyObject 개체가 컨테이너에 등록됩니다.

어떻게 작동합니까?

편집 : MyObject를 이런 식으로 정의된다

public class MyObject : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private bool _myProperty; 
    public bool MyProperty 
    { 
     get { return _myProperty; } 
     set 
     { 
      if (value == _myProperty) 
       return; 

      _myProperty = value; 
      OnPropertyChanged("MyProperty"); 
     } 
    } 
} 
+0

'MyObject'의 정의 게시 - 하드 방아쇠만으로도 많은 것을 진단 할 수 있습니다. – JerKimball

+0

완료, MyProperty가 자주 채워지고 UI의 상태가 업데이트되어야합니다. – Shankar

+0

음 ... 아무것도 튀어 나오지 않습니다. 왜 트리거 바인딩에 'Mode = OneWay'가 표시됩니까? 오, 디버거가 연결되어있는 출력 창에 바인딩 오류가 있습니까? – JerKimball

답변

0

난 당신이 게시 한 코드에 "잘못"아무것도 표시되지 않습니다를 - 당신은 당신이 속성 값을 변경하는 절대적으로 확신 , 그리고 적절한 호출을 다시 수행해야합니다. Dispatcher?

대신이 구조를 사용해 볼 수 있습니까? (추측, 그것은 당신의 상황에 맞는 것하지 않도록)

[편집 : 여기 메모리에서거야, 그래서 구문이 필요 미세 조정]

<Trigger Property="{Binding Path=DataContext.MyObject.MyProperty, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False"> 
    <Setter Property="IsEnabled" Value="False" /> 
</Trigger> 
+0

아니요, 작동하지 않습니다! – Shankar

0

는 당신에게 RelativeSource 일없이 확실 명시적인 FindAncestor? 변경하려고

RelativeSource={RelativeSource AncestorType=UserControl}}"

에 :

RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"

+0

http://stackoverflow.com/questions/84278/how-do-i-use-wpf-bindings-with-http://www.windowsazure.com/media/devcd/html/cpguide/html/default.aspx에 따르면, 명시 적이고 상태가 Mode = FindAncestor 인 것이 더 좋다고 말할 수 있지만 기본값에 대한 희망보다 좋습니다. 그것도 여전히없이 일해야 relativesource. – Viv

+0

그러면 우리는 더 많은 컨텍스트를 제공해야 할 것입니다. 전체 UserControl XAML을 게시하고 btw를 게시해야합니다. 왜 [OnPropertyChanged]는 해당 [NotifyPropertyChangedInvocator] 속성으로 표시되어 있습니까? –

0

DataContextMyObject의 인스턴스로 설정되어있는 경우 - 다음 방금 DataContext.MyProperty을 원하는 - 당신의 데이터 컨텍스트 정말 MyObject라는 속성을 가지고하지 않는 한 이는 MyObject의 인스턴스이기도합니다.

DataContext.MyProperty (DataContext 이미 MyObject를 인스턴스)입니다

DataContext.MyObject.MyProperty

(당신의 데이터 컨텍스트 개체 (뷰 모델은 있는가) 정말 유형을 MyObject의 MyObject를라는 속성이)

예 :

<DataTrigger Binding="{Binding Path=DataContext.MyProperty, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False"> 
    <Setter Property="IsEnabled" Value="False" /> 
</DataTrigger> 

내가 만약 당신이 ViewModel에 대한 코드를 게시 할 수 있습니까? 즉, DataContext로 설정된 것은 무엇입니까?

관련 문제