2013-04-30 3 views
4

WPF에서 또 다른 바인딩 기이 한 현상이 발생했습니다. 다음 클래스를 고려하고 IStupid 입력 속성은 MyStupid 전화 : 형식화 된 인터페이스의 바인딩에 대한 바인딩

public struct DumbClass 
{ 
    public IStupid MyStupid { get { return new IsStupid(); } } 
} 
public interface IStupid{} 
public class IsStupid : IStupid{} 

지금에 다음과 같은 바인딩을 고려

ListBox :

<ListBox Name="OptOccurances" Height="238" HorizontalAlignment="Left" Margin="130,34,0,0" VerticalAlignment="Top" Width="229" > 
</ListBox> 

다음 XAML에 대한 특별한 것은 없다

var items = new List<DumbClass>(new []{new DumbClass(), new DumbClass(), new DumbClass()}); 
OptListBox.ItemsSource = items; 

예상대로 목록 상자의 출력은 "MyProject.DumbClass"의 3 행입니다.

DisplayMemberPath="MyStupid" (또는 템플릿의 TextBlock에 직접 'MyStupid'를 바인딩하는 ItemTemplate을 만들면), 나는 MyProject.IsStupid이라고 말했을 때 3 개의 빈 행을 얻습니다. 데이터 바인딩 엔진이 기본 ToString() 구현을 호출하고 클래스 이름을 표시 할 수없는 이유는 무엇입니까? 인터페이스 유형 지정 등록 정보에 대한 일시적인 해결책이 있습니까? 적어도 바인딩 오류가 발생하지 않는 이유는 무엇입니까?

+0

+1의 값을 얻기 위해 다르게 작동합니다. –

+0

'DumbClass'라는 구조체는 클래스가 아니라는 것을 알지 못하기 때문에 진정으로 바보입니다. – Dan

+0

바인딩 오류가 "throw되지 않습니다." Visual Studio의 출력 창에 바인딩 오류가 있는지 확인할 수 있습니까? –

답변

3

이 문제를 재현 할 수 있습니다. WPF 버그처럼 보입니다.

<ListBox x:Name="OptOccurances" Height="238" HorizontalAlignment="Left" Margin="130,34,0,0" VerticalAlignment="Top" Width="229" > 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=MyStupid, StringFormat='{}{0}' }"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

는 일반적으로 당신이 WPF 추적 설정을 사용할 수 있습니다 : 당신이 강제로 문자열 속성 값을 변환합니다있는 StringFormat 매개 변수와 함께 항목의 DataTemplate을 사용할 수 있습니다, 대신 DisplayMemberPath의 : 여기

당신이 사용할 수있는 해결 방법입니다 이런 종류의 문제를 찾아 내십시오 : enter image description here

그러나이 경우에는 바인딩 오류가 발생하지 않습니다.

private void btn_Click_1(object sender, RoutedEventArgs e) 
    { 
     var listBoxItem = OptOccurances.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem; 
     var item = OptOccurances.Items[1] as DumbClass; 
     var tbk = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(listBoxItem, 0),0),0) as TextBlock; 
     var binding = BindingOperations.GetBinding(tbk, TextBlock.TextProperty); 
     var be = BindingOperations.GetBindingExpression(tbk, TextBlock.TextProperty); 
     var vs = DependencyPropertyHelper.GetValueSource(tbk, TextBlock.TextProperty); 
     var val = tbk.GetValue(TextBlock.TextProperty); 
    } 
: 당신은 그것의 바인딩과 TextBlock의를 얻을 수있는 다음 코드를 사용하여 enter image description here

:

또한 당신은 당신이 디버그 시계에서 나무를 오른쪽으로 조사 할 수 있습니다 비주얼 스튜디오 2012에 대한 WPF 비주얼을 사용할 수 있습니다

그리고 바인딩 상태가 실제로 활성화되어 있고 매핑 된 개체가 올바른 것으로 나타납니다. 분명히 Binding (PropertyPathWorker)의 내부 구조는 foo/bar 이외의 다른 것을 위해

+0

추적 설정이 자세한 정보로 설정된 경우에도 추가 정보가 없습니다. 아니요, 구조체는 문제가 아닙니다. 클래스와 동일한 작업을 수행합니다. 아니요, 문자열 유형 속성이 올바르게 작동합니다. IsStupid 유형의 속성조차도 잘 작동합니다 (IStupid와 반대 됨). 그래도 wpf 추적 설정에 문제가있는 것으로 보이는 인터페이스 유형은 –

+0

+1입니다. –

+0

해결 방법으로 답변을 업데이트했습니다. –