2013-08-19 3 views
1

데이터 형식의 연결된 속성에 흥미로운 점이 있지만 매우 이상하다는 것을 알고 있습니다.데이터 형식의 동작 초기화

내가 그것에 종속성 속성과 동작을, 재산은 당신이 볼 수 있듯이 List<DataStatePair>

[System.Windows.Markup.ContentProperty("StateDefinitions")] 
public class MultiDataStateBehavior: StateBehaviourBase 
{ 
    public List<DataStatePair> StateDefinitions 
    { 
     get { return (List<DataStatePair>)GetValue(StateDefinitionsProperty); } 
     set { SetValue(StateDefinitionsProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for StateDefinitions. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty StateDefinitionsProperty = 
     DependencyProperty.Register("StateDefinitions", typeof(List<DataStatePair>), typeof(MultiDataStateBehavior), new PropertyMetadata(new List<DataStatePair>())); 
} 

을 입력, 난 content 속성으로 표시했습니다. XAML은 다음과 같습니다.

<DataTemplate> 
<!-- VISUAL STATES OMITTED FOR BREVITY--> 
<Grid x:Name="grid" Background="Transparent" ContextMenu="{StaticResource ContextMenu_ToolMenu}"> 
        <i:Interaction.Behaviors> 
         <ext:MultiDataStateBehavior Binding="{Binding Type}"> 
           <ext:DataStatePair State="None" Value="{x:Null}"/> 
           <ext:DataStatePair State="Gauge" Value="{x:Static jcm:ToolType.Gauge}"/> 
           <ext:DataStatePair State="Repeater" Value="{x:Static jcm:ToolType.Gauge}"/> 
         </ext:MultiDataStateBehavior> 
        </i:Interaction.Behaviors> 
</Grid> 
</DataTemplate> 

문제가 있습니까? 3 DataStatePair 인스턴스는 데이터 형식을 사용할 때마다 추가됩니다. 내 응용 프로그램에서 템플릿을 32 번 사용하고 총 96 개의 DataStatePair 인스턴스를 얻습니다. 그리즐리! 이것이 가능한 방법을 이해합니다. 비헤이비어는 데이터 템플릿에 대해 정적이지만 DataStatePair 인스턴스는 아니며 목록을 추가 할 수 있습니다.

종속성 속성을 IEnumerable로 변경하면 모든 것이 손상되어 컴파일되지 않습니다. XAML에서 x : Array를 사용하여 속성을 명시 적으로 설정하면 모든 것이 예상대로 작동합니다. 아래의 XAML;

<i:Interaction.Behaviors> 
         <ext:MultiDataStateBehavior Binding="{Binding Type}" UseTransitionsOnLoad="True"> 
          <ext:MultiDataStateBehavior.StateDefinitions> 
           <x:Array Type="{x:Type ext:DataStatePair}"> 
            <ext:DataStatePair State="None" Value="{x:Null}"/> 
            <ext:DataStatePair State="Gauge" Value="{x:Static jcm:ToolType.Gauge}"/> 
            <ext:DataStatePair State="Repeater" Value="{x:Static jcm:ToolType.Gauge}"/> 
           </x:Array> 
          </ext:MultiDataStateBehavior.StateDefinitions> 
         </ext:MultiDataStateBehavior> 
</i:Interaction.Behaviors> 

왜 이것이 가장 훌륭한 해결책인지 누구에게 알 수 있습니까? 나는 Microsoft 구현으로 x : Array를 사용하지 않을 것이라고 상상할 수 있습니다.

편집 : x : Array 솔루션은 블렌드 디자이너를 중단시킵니다.

XamlParseException : 타입의 컬렉션에 부가 가치를 'System.Collections.Generic.IEnumerable (SSW.WPFExtensions.DataStatePair)' 예외가 발생했습니다.

편집 : [System.Windows.Markup.ContentProperty("StateDefinitions")] 속성 정의를 제거하면 잘 작동합니다. 나는 무슨 일이 일어나는지 이해하지 못한다!

WPF, 뭐하는거야? WPF, 스태프

답변

1

잠재적 인 해결책 ... 그리고 이것은 두더지입니다.

Microsoft는 컬렉션here 인 종속성 속성을 만드는 방법에 대한 지침을 제공합니다.

이 설명서에서는 속성의 기본값을 인스턴스로 선언하지 말고 소유 클래스의 생성자에서 컬렉션을 초기화하고 종속성 속성을 설정하도록 지정합니다. 예.

public Aquarium() : base() 
{ 
    SetValue(AquariumContentsPropertyKey, new List<FrameworkElement>()); 
} 

... [] 단일 목록 기본 값이 수족관의 모든 인스턴스 공유됩니다. 에 관해서는

: 당신은 당신이 두 개의 수족관 인스턴스를 인스턴스화하고 그들 각각에 하나의 다른 물고기를 추가하는 방법을 보여하고자하는 다음 테스트 코드를 실행 한 경우, 당신은 놀라운 결과를 볼 것이다 내 디자인 타임 예외. 동일한 문제가 새로운 DataStatePair[0]과 같이 변경 될 수 있으며, 이는 끔찍한 오류보고입니다.

결론 - Microsoft의 누군가 내 비용으로 좋은 웃음을 보내고 있습니다.