2012-02-14 3 views
0

내 .NET 4.0 프로젝트에서 공용 필드가있는 객체가 있는데이 객체는 INotifyPropertyChanged를 구현하거나 DependencyObject를 상속하지 않으며 결코 수행하지 않습니다. 그러나 WPF 컨트롤에서이 개체의 필드에 "바인딩"하는 메커니즘이 필요합니다. 바인딩에 종속성 속성 (또는 최소한 속성 및 속성 변경 알림)이 필요하므로 직접 바인딩 할 수 없다는 것을 알고 있으므로 필요한 바인딩 기능을 구현하려면 어떻게해야합니까?비 종속성 객체의 필드에 바인딩

void FirePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public float Friction 
    { 
     get 
     { 
      if (CurrentObject != null) 
      { 
       return CurrentObject.Friction; 
      } 
      else 
      { 
       return 0.0f; 
      } 
     } 
     set 
     { 
      if (CurrentObject != null) 
      { 
       CurrentObject.Friction = value; 
       FirePropertyChanged("Friction"); 
      } 
     } 
    } 

    public PlatformObjectTemplate CurrentObject 
    { 
     get 
     { 
      return GetValue(CurrentObjectProperty) as PlatformObjectTemplate; 
     } 
     set 
     { 
      SetValue(CurrentObjectProperty, value); 
      FirePropertyChanged("Friction"); 
      FirePropertyChanged("CurrentObject"); 
      BindShapes(); 
      IntersectionComboBox.SelectedItem = CurrentObject.IntersectionStaticMethod; 
     } 
    } 

    public static readonly DependencyProperty CurrentObjectProperty = DependencyProperty.Register("CurrentObject", typeof(PlatformObjectTemplate), typeof(PlatformStaticObjectPropertyEditor), new PropertyMetadata(null)); 

내 WPF 컨트롤에서 INotifyPropertyChanged를 구현, 내 PlatformObjectTemplate 속성, Friction 같은 단지 public 필드가없는 : 내 WPF 컨트롤이 뭔가를 시도했습니다. XAML의 개체를 다음과 같이 바인딩해야합니다.

(내 컨트롤) : // DoubleUpDown은 WPF 도구 키트에서 가져온 것입니다. (내 메인 창에서)

<tk:DoubleUpDown Margin="91,10,7,0" Name="doubleUpDown1" VerticalAlignment="Top" Value="{Binding Friction, ElementName=window, FallbackValue=0}" /> 

:

<my:PlatformStaticObjectPropertyEditor x:Name="platformStaticObjectPropertyEditor1" CurrentObject="{Binding CurrentObject, ElementName=window}" /> 

나는 마찰 속성의 게터에 중단 점을 넣어, 그리고 그것은 CurrentObject가 바인딩 전에 결합을 시도, 그것이 null 때문에 , 개체에서 올바른 마찰 값을 읽을 수 없습니다. Friction CurrentObject의 setter에서 속성을 변경하려고 시도했지만 CurrentObject가 설정되면 Friction을 채 웁니다. 그러나이 중 하나는 작동하지 않습니다.

PlatformObjectTemplate 것이다 하지 사용 속성 :

좋아, 여기에 두 가지 요구 사항이 있습니다. 공개 필드가 있습니다. 위의 XAML에서 사용한 것처럼 선언적 바인딩 방식이 필요합니다.

나는 아마도 복잡한 일을 겪었을 것이고 나는 물건을 놓쳐 버렸을 것이다. 위의 요구 사항의 제약 내에서이 올바른 작업을 수행하는 데 가장 올바른 "선언적"방법은 무엇입니까?

감사합니다. 수 있습니다.

+0

출력 창에 바인딩 오류가 있습니까? 컨트롤의 바인딩은'Value = "{Binding Friction, ElementName = window, FallbackValue = 0}입니다."- 컨트롤의 루트를 참조하는 것입니까, 아니면 창을 참조합니까? 'Friction' 속성을 수동으로 변경하면 어떻게됩니까? –

+0

아니요,이 바인딩에 대한 출력에서 ​​바인딩 오류가 발생하지 않습니다. 예, 혼란에 빠져서 죄송합니다. "창"은 제어 루트 자체를 의미합니다. 일을 더 간단하게하는 것은 제 자신의 컨벤션입니다. 컨트롤이나 창에 상관없이 "창"이라는 단어를 사용하여 루트 이름을 지정하면됩니다. –

+0

INPC를 구현하는 래퍼 생성 –

답변

1

object neither implements INotifyPropertyChanged nor inherits DependencyObject, and it will never. However, I need a mechanism to "bind" to fields of this object in my WPF control

poyra는,이 같은 상황이있다. 인스턴스 필드에 바인딩 할 수 없으므로 가장 좋은 방법은 INotifyPropertyChanged을 구현하는 래퍼 클래스를 만드는 것입니다.

+0

오케이, 나는 이것이 실현 가능한 유일한 방법이라고 생각합니다 ... 감사합니다. –