2013-06-12 2 views
3

나는 각각 Item Attributes의 컬렉션을 포함하는 뷰 모델을 가지고 있으며, 각각은 이미지 경로를 포함합니다. 컬렉션의 항목 속성은 0 .. N입니다.인덱싱 된 속성의 템플릿 만들기

내보기의 스택 패널에는 세 개의 동일한 이미지 컨트롤이 있습니다. 각 이미지 제어 항목 속성 화상의 경로에 결합되어

화상 제어 1은 첫번째 아이템 속성의 이미지 경로에 결합 된
  • (ItemAttributes에 위치한 [0] 이미지입니다)
  • 화상 제어 2에 바인딩 (ItemAttributes 1 이미지입니다 있음) 2 항목 속성의 이미지 경로
  • 3 개 이상의 속성이있는 경우 제어 (3) 3 항목 속성의 이미지 경로에 바인딩
  • 이미지는

(ItemAttributes [2] 이미지입니다 있음) , 무시됩니다. 0-2 특성 (이미지 컨트롤 중 하나 이상이 null에 바인딩됨을 의미 함)을 가질 가능성을 처리하기 위해 this post에 표시된 오류를 제공하므로 다음과 같은 데이터 트리거를 추가했습니다.

또한 인덱스를 벗어나는 문제를 방지하기 위해 필자는 뷰 모델의 항목 특성을 세 가지 속성으로 분할했습니다. (처음에는 String.Empty를 반환했지만 null로 변경하여 데이터 트리거) :

public string Attribute1 
{ 
    get { return _item.Attributes.Count > 0 ? _item.Attributes[0].Image : null; } 
} 
public string Attribute2 
{ 
    get { return _item.Attributes.Count > 1 ? _item.Attributes[1].Image : null; } 
} 
public string Attribute3 
{ 
    get { return _item.Attributes.Count > 2 ? _item.Attributes[2].Image : null; } 
} 

내 문제는이 데이터 트리거가 모든 세 가지 이미지 속성과 해당 이미지 컨트롤 (폭, 높이, 여백 등의 다른 속성과 함께). 그래서 저는 그것을 스타일에 넣고 그것을 정적 자원으로 참조한다고 생각합니다. 다른 이름 (Attribute1, Attribute2, Attribute3)으로 세 개의 다른 속성이있는 경우에는 작동하지 않습니다. 그래서 지금은 이런 식으로 일을 붙어하고 다음 속성 1이 속성 2와 Attribute3로 치환 제외

<Image> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Source" Value="{Binding Attribute1}" /> 
      <Setter Property="Width" Value="44" /> 
      <Setter Property="Height" Value="45" /> 
      <Setter Property="Margin" Value="5" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Attribute1}" Value="{x:Null}"> 
        <Setter Property="Source" Value="{x:Null}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 

이 다른 두 이미지 컨트롤에 대해 반복된다.

그래서 나는 내가 이미지 컨트롤에 관심이 인덱스가 외부 바인딩 specifcy 다음 대신 컬렉션에 바인딩 할 수있는 방법이 있는지 등

<DataTrigger Binding="{Binding Attributes}" Value="{x:Null}"> 
    <Setter Property="Source" Value="{x:Null}"/> 
</DataTrigger> 

로, 궁금 ...되었다 템플릿 (데이터 트리거에 매개 변수를 전달하는 것 같아요).

어떤 아이디어라도 가능하지 않다면 다른 접근법이 있습니까?

+1

야, 왜 당신은 모든 너무 복잡하게 수행합니다는 _attributes 백업 필드 SmartObservableCollection 속성 (사용자 정의 ObservableCollection에와 AddRange 방법과 몇 가지 다른 케이크) 속성을 무엇입니까? 'ObservableCollection '에 바인드 된'ItemsControl'을 사용하고'Attribute1, Attribute2, Attribute3 ...'을 잊어 버리십시오. –

+0

@HighCore : 저는 WPF 세계에서 여전히 아주 초록색이어서 항상 가장 쉽거나 뭔가를하는 가장 적절한 방법. –

답변

7
<ItemsControl ItemsSource="{Binding Attributes}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Image Source={Binding Something} x:Name=Image/> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding={Binding Something} Value={x:Null}> 
        <Setter TargetName=Image Property=Source Value={x:Null}/> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

실제 XAML이 아니라 수동 입력입니다. 그러나 당신은 내가 의미하는 것을 이해할 수 있어야합니다.

편집 : 당신의 Attributes 그냥 문자열이 있다면 내가 배치 된 곳, "{Binding}"를 사용 "{Binding Something}"

--update (나는 당신의 대답은 정확하기 때문에 무슨 짓을했는지와 함께 답변을 업데이 트됩니다) -

<ItemsControl ItemsSource="{Binding Attributes}" 
       Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Margin="5"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" 
         HorizontalAlignment="Left" VerticalAlignment="Top" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Image x:Name="Image" 
        Source="{Binding}" 
        Width="45" Height="44" Margin="5" /> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding}" Value="{x:Null}"> 
        <Setter TargetName="Image" 
          Property="Source" Value="{x:Null}" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

처음 세 항목 속성으로 제한하기 위해 내보기 모델의 생성자에서 사용한 것입니다.

_attributes = new SmartObservableCollection<string>(); 
var images = from attributes in _item.Attributes 
      select attributes.Image; 

Attributes.AddRange(images.Take(3)); 
+0

감사합니다. 나는 그것을 한 번 줄 것이다 ... 나는 여전히 배우기 때문에, 지나치게 복잡하게 만드는 것은 보통 나에게서 완전히 무언가를 이해하지 못한다. –

+0

+ 1 옙, 자유로 웠기 때문에 컴파일되지 않지만 핵심은 거기에 있습니다. –

+0

답변의 내 업데이트가 컴파일됩니다. Image Source 바인딩과 일부 데이터 트리거 바인딩에 대한 일부 따옴표가 누락되었습니다. –