2012-06-22 5 views
1

WPF에 object 유형의 객체에 바인딩을 수행 할 때 binding에 대상 유형을 정의 할 수있는 기능이 있는지 묻고 싶습니다. 하나의 객체 유형으로 처리해야하는 유형 "object"의 일반 콜렉션이 있으며 다양한 바인딩 포인트에서 다른 객체 (즉, DateTime,등)를 처리해야합니다.명시 적으로 WPF 바인딩 데이터 유형을 설정합니다.

임의로 .NET Framework에서 컴파일 타임에 알 수없는 형식의 개체를 Type_X의 개체로 처리 할 수 ​​있습니까? 바인딩을 처리 할 때 사례별로?

+0

전달 된 값의 유형에 따라 값을 반환하는 변환기를 만들 수 있습니다. – benjer3

답변

2

아니요, Binding 클래스는 이러한 기능을 제공하지 않습니다. 실제로 그것은 필요하지 않습니다. 바인딩 프레임 워크는 소스 객체를 관련 유형으로 자동 변환하고 바운드 속성 값을 사용합니다. 그렇지 않으면 해당 속성을 찾을 수없는 경우 바인딩 오류가 발생합니다. 내 ViewModel

public object Dummy 
{ 
    get 
    { 
     return dummy; 
    } 
    set 
    { 
     dummy = value; 
     NotifyPropertyChanged("Dummy"); 
    } 
} 

Object 유형의 속성을 가지고있는 경우

그래서 나는이 같은 TextBox에 바인딩 -

<TextBox Text="{Binding Dummy.Name}" HorizontalAlignment="Stretch"/> 

을 나중에이 같은 객체에 더미를 설정 -

Dummy = new MyCustomType(); 

이 시점에서의 평가는 te이고 소스 객체 (Dummy)에 Name 속성을 찾고 이 Name이라는 공용 속성을 정의하면 바인딩이 실행됩니다. 그렇지 않으면 바인딩 오류가 발생합니다 (오류 메시지 만 예외는 아닙니다). 출력 창에서). Botz300는

  • 을 제안

    1. DataTemplates 정의 -

      자, 경우에 나는 두 가지 유형의 오브젝트 (하나 Name을 가진 다른 FirstName을 가진) 나는이 두 가지 옵션이 있습니다 내 Dummy 속성을 설정하려면 ValueConverter (오브젝트 유형을 확인하고 관련 특성 값을 리턴)을 사용하십시오.

    ValueConverter를 사용하는 또 다른 변형 자동 변환이 수행됩니다 바인딩에 다음, 변환을 수행하고 TypeConverterAttribute로 선언하는 TypeConverter을 정의한다.

    동일하게 개체를 수집합니다.

    업데이트 :

    예, WPF는 암시 적으로 관련 표시 값에 형식을 변환 할 DefaultType 컨버터를 사용합니다.Object을 속성 (위의 예에서 Text)에 직접 바인딩하는 경우 WPF는 해당 유형 (사용 가능한 경우)에 TypeConverter을 사용하거나 ToString() 메서드를 사용하여 표시 값을 가져옵니다.

    그러나이 모든 것은 데이터를 표시하는 데 사용하는 컨트롤과 바인딩 방법/방법에 따라 다릅니다.

    참고 :이 속임수는 간단한 텍스트 표현을 가질 수있는 개체 만 있으면 충분합니다. 복잡한 데이터 객체를 다룰 때이 편리한 기술을 사용하는 것이 이치에 맞지 않을 수도 있습니다.

    당신은이에 대해 이야기 MSDN에이 문서를 통해 갈 수 있습니다 - Customize Data Display with Data Binding and WPF

  • +0

    당신의 대답은 아주 좋은 것처럼 들리네, 내 문제를 이해 한 것 같아. 필자의 경우, 객체 타입 프로퍼티는 정수, 날짜 등과 같은 원시 타입만을 가질 수있다. 이제는 바인딩 프레임 워크가 특정 타입의 프로퍼티처럼 동작하도록하고 싶다. ValueConverter로 얻은 것입니다. 이 샘플을 보내 주실 수 있습니까? "기본"변환기를 사용할 수 있습니까? 그 바인딩 프레임 워크가 사용하는 것 같습니다. 아니면 정말로 새로운 자체 변환기를 작성해야합니까? – user1039407

    +0

    바인딩이 그렇게해야합니다. 예를 들어,'ToolTip'이 Object 유형이기 때문에'ToolTip = "{Binding Price, StringFormat = c}"':'StringFormat'은 자동으로 무시됩니다. 디버그 출력에 아무것도 없습니다. XAML의 핵심 디자인 목표 중 하나는 "가능할 때마다 명백하지 않은 이유로 침묵 오류가 발생 함"이지만 이는 좋은 생각이라는 의미는 아닙니다. 예, StringFormat의 특정 문제를 해결할 수있는 몇 가지 방법이 있습니다. 항상 거기에 있습니다. –

    4

    물론, DataTemplates을 사용할 수 있습니다. 당신이 당신의 App.xaml에서 그들을 정의하는 경우, 그들은 전 세계적으로 적용됩니다 :

    <DataTemplate DataType="{x:Type local:YourType}"> 
        <TextBox Text="{Binding SomeProperty}" HorizontalAlignment="Stretch"/> 
    </DataTemplate> 
    

    을 이제 당신이 StackPanel에서처럼, 어딘가 UI에서 실행시의 형태 YourType의 객체를 추가 할 때마다, 템플릿이 사용됩니다.

    +0

    미안하지만, 내가 찾고있는 것이 아닙니다. 예를 들어, DateTime 유형과 같이 비특이적 유형 "객체"의 속성에 대한 바인딩을 만드는 방법을 찾으려고합니다. – user1039407

    +0

    @ user1039407 그래서 런타임 유형이'object' 인 객체를 가지고 datetime과 같이 동작 시키길 원합니까? 어디서 실제 DateTime 데이터를 얻을 수 있습니까? – Botz3000

    0

    은 어쩌면 당신은 D와 디자인 타임의 DataContext를 설정할 수의 DataContext를 - 당신은 당신의 IDE 알고 싶은 경우에 어떤 종류의 데이터 그것을 기대하셔야합니다.

    <ContextMenu ItemsSource="{Binding Shapes}" 
          DataContext="{Binding Data, Source={StaticResource BindingProxy}}" 
          d:DataContext="{d:DesignInstance tree:DesktopViewModel}"> 
        [items...] 
    </ContextMenu> 
    

    는 나는 (Object 유형의 데이터 속성이)가 BindingProxy에서의 DataContext의 가져옵니다의 ContextMenu 있습니다. VS 및 Resharper가 올바르게 작동하려면 DataContext의 형식을 알아야하기 때문에 간단히 designtime DataContext를 정의하고 이제는 DesktopViewModel이라는 것을 알고 있습니다.

    이것은 DataContext와 만 작동하며 DesignTimeBinding 같은 것이 없으므로 바인딩이 필요하지 않지만 DataContext를 참조하도록 바인딩을 다시 작성할 수 있습니다 (또는 DataContext 및 d : DataContext).

    관련 문제