2012-06-26 2 views
1

링크 단추를 표시하는 ListView가 있습니다. 'FileAddress'문자열에 값이 있으면 링크 단추 만 표시해야합니다. 그렇지 않으면 Title과 함께 간단한 TextBlock을 표시해야합니다.바운드 값을 기반으로 ListView 다른 컨트롤

<GridViewColumn.CellTemplate> 
    <DataTemplate> 
     <Button Style="{StaticResource LinkButton}" Height="23" Content="{Binding Path=Title}" /> 
    </DataTemplate> 
</GridViewColumn.CellTemplate> 

모든 아이디어를 얻을 수 있습니다.

TIA.

답변

2

나는 이러한 유형의 변경을 수행하는 것이 조금 어색하다 "gridview에"WPF의 간단한 구성 요소 ...을 고려하십시오.

당신은 세 가지 다른 접근 할 수 있습니다 : 내가 원하는대로 동작 UserControl을 만들기 = (

2)을 좋아하지 않지만

1) 사용 GridViewColumn.CellTemplateSelector (http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector)
를 .
이 적절하고 비교적 쉽게 보인다

3) 트리거를 통해 버튼 스타일을 변경 :

  <Button.Style> 
      <Style TargetType="Button"> 
       <Style.Triggers> 
        <Trigger Property="Content" Value="{x:Null}"> 
         <!-- Changes --> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 

또는

   <Style TargetType="Button"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="Button"> 
          <Grid> 
           <!-- Template --> 
          </Grid> 
          <ControlTemplate.Triggers> 
           <Trigger Property="Content" Value="{x:Null}"> 
            <!-- Changes --> 
           </Trigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 

트리거를 사용하는 경우 제한이 때로는 끝이있다 xaml을 망쳐 놓는 것이 상대적으로 쉽고 간단하다는 것을 안다면 버튼을위한 새로운 템플릿을 만들어야합니다.

샘플 (I 여기에 버튼이 있고 나는 그의 이미지를 변경있어) :

<Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"> 
        <Image x:Name="imgBackground" Source="{StaticResource UpArrowImageNormal}" Stretch="None"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="imgBackground" 
           Property="Source" Value="{StaticResource UpArrowImageIsPressed}"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter TargetName="imgBackground" Property="Source" Value="{StaticResource UpArrowImageDisabled}"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
+0

바인딩 나는 사용자 정의 컨트롤로 갔다. 원래는 트리거를 시도했지만 'else'사례를 수행하는 방법을 파악할 수 없었습니다. – tzerb

+0

트리거가 다른 것을 허용하지 않습니다. 당신은에 따라 로직을 수행해야합니다 정상 상태! 내용 = 널 다른 주 (트리거) : 콘텐츠 == 널 (null)입니다. 모든 설정자 가시성 또는 스타일 변경이 트리거 됨 트리거가 원래 상태로 돌아가는 것이 현명하다는 것을 기억하십시오. –

0

당신은 사용하여 다음을

[ValueConversion(typeof(Object), typeof(Visibility))] 
public class NullVisibilityConv : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) return Visibility.Collapsed; 
     else return Visibility.Visible; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value; 
    } 

} 

당신은 다음 컨트롤에 바인딩 할 수있는 다음과 같은 컨버터를 사용할 수 있습니다 xaml

<GridViewColumn.CellTemplate> 
    <DataTemplate> 
     <Button Style="{StaticResource LinkButton}" Height="23" Content="{Binding Path=Title}" 
       Visibility="{Binding FileAddress, Converter={StaticResource NullToVisConverter}}"/> 
    </DataTemplate> 
</GridViewColumn.CellTemplate> 

또한 변환기를 xa 어딘가에 리소스로 선언해야합니다. ml의

<converters:NullVisibilityConv x:Key="NullToVisConverter" /> 

이 방법의 장점은 당신이 당신의 코드에서 컨버터를 선언 후에는 다음 당신의 가시성이 변환기를 사용, 트리거 또는 다른 복잡한 코드를 추가하지 않고 다른 바인딩에 다시 재사용 할 수 있다는 것입니다 그것은 나를위한 가장 간단한 이후

관련 문제