2014-06-20 2 views
0

그래서 Caliburn Micro Framework로 창 프로젝트를 만들었습니다. 내 목표는 프로그래밍 방식으로 Grid Row의 내용을 대체 할 수 있다는 것입니다. 아니면 그냥 내 그리드의 상단에 새 행을 추가, 그래서 대신에 그리드가 .xaml이 보이는 내가 3이 2 개 행을 갖는 :Caliburn Micro를 사용하여 변수에 격자 바인딩하기

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="30"></RowDefinition> 
     <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
    <TextBlock Text="{Binding Path=LocalizedResources.NGA, Source={StaticResource LocalizedStrings}}" Visibility="{Binding Path=ShowNoGolferMessage,Mode=TwoWay}"></TextBlock> 
    <ListBox Grid.Row="1" x:Name="lstSearch" ItemsSource="{Binding GolferList, Mode=TwoWay}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       //Long list of ListBox items. 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

그래서 내 생각 변수에 그리드를 결합했다 x를 사용하여 : 이름 :

<Grid x:Name="golfereGrid"> 

그러나 나는 그것을 작동시킬 수 없었다.

<Grid DataContext="{Binding golfereGrid, Mode=TwoWay}"> 

그것은 두 경우 모두 내 golfereGrid가 null로 판명 중 하나가 작동하지 않았다 : 그럼 난 그리드의 DataContext에 바인딩을 설정했습니다. 내 golfereGrid은 다음과 같습니다 : 지금 약간의 시간이 고민 했어요

private Grid _golfereGrid; 
public Grid golfereGrid 
{ 
    get { return _golfereGrid; } 
    set 
    { 
     _golfereGrid = value; 
     NotifyOfPropertyChange(() => golfereGrid); 
    } 
} 

, 내가 어떤 도움을 주셔서 감사합니다 것

+0

좋아, 내가 ' 세미 솔루션을 발견했습니다. 그리드에서 3 행을 만들고 행 0과 1의 높이를 바인드 한 다음 행 1을 상단에 놓을 때 행 0 높이를 0으로 변경하고 행 1을 등 150으로 변경하십시오. 행 0이 필요할 때 150을 지정하면 높이와 행 1 0height에서. 누구든지 더 나은 해결책을 얻었습니까? – user2408952

답변

1

난 당신이 효과적으로 TextBlock의를 숨기려고하는 문제/질문을 이해한다면/ListBox에 내용이 있는지 여부에 따라 ListBox; 가장 쉬운 방법은 ValueConverter를 사용하여 bool을 Visibility로 변환하는 것입니다. 리소스 사전에 예를

public class BooleanToVisibilityConverter : IValueConverter 
{ 
    public bool IsNegation { get; set; } 

    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (this.IsNegation) 
     { 
      return (value is bool && (bool)value) ? Visibility.Collapsed : Visibility.Visible; 
     } 

     return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return value is Visibility && (Visibility)value == Visibility.Visible; 
    } 
} 

를 들어

(즉 당신의 App.xaml에 등록)을

<valueConvertors:BooleanToVisibilityConverter x:Key="BooleanToVisibility" /> 
<valueConvertors:BooleanToVisibilityConverter x:Key="BooleanToVisibilityReverse" IsNegation="True" /> 

(내 예 만로 다음)에 맞게 이름으로 컨버터를 정의

<Grid> 
<Grid.RowDefinitions> 
    <RowDefinition Height="*" /> 
</Grid.RowDefinitions> 
<TextBlock Text="{Binding Path=LocalizedResources.NGA, Source={StaticResource LocalizedStrings}}" 
      Visibility="{Binding Path=ShowNoGolferMessage, Converter={StaticResource BooleanToVisibilityReverse}}" /> 
<ListBox Grid.Row="1" x:Name="lstSearch" ItemsSource="{Binding GolferList, Mode=TwoWay}" 
      Visibility="{Binding Path=ShowNoGolferMessage, Converter={StaticResource BooleanToVisibility}}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <!-- Long list of ListBox items --> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

이 같은 컨버터를 사용하도록 XAML 업데이트

모델 내에서 ShowNoGolferMessage에 대한 bool 속성이 있다고 가정하고 있으므로 골퍼가 NotifierOfPropertyChange() => ShowNoGolferMessage를 호출하면됩니다.

내가 만들 것 또 다른 제안은 당신이 어떤 종류의 IEnumerable을 결합이다 - 여기에 꽤 유용하다 qmatteo에 의해 좋은 예가 (자신의 사이트는 말도 가득!) : qmatteoq.com Diary of a Windows Phone developer

관련 문제