Привязка сетки к переменной, используя Caliburn Micro

#c# #xaml #windows-phone-8 #caliburn.micro

#c# #xaml #windows-phone-8 #caliburn.micro

Вопрос:

Итак, я получил этот проект для Windows phone, созданный с помощью Caliburn Micro Framework. Моя цель — программно заменить содержимое в строке сетки. Или просто добавьте новую строку в верхней части моей сетки, чтобы вместо 2 строк у меня было 3. В .xaml сетка выглядит следующим образом:

 <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:Name:

 <Grid x:Name="golfereGrid">
  

Но я не смог заставить это работать. Затем я попытался установить привязку к сеткам DataContext:

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

Это тоже не сработало, в обоих случаях моя golfereGrid оказалась нулевой. Моя сетка для гольфа выглядит так:

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

Я уже некоторое время борюсь с этим, я был бы признателен за помощь

Комментарии:

1. Хорошо, я нашел полурешение. Создайте 3 строки в сетке, а затем привяжите высоту для строк 0 и 1. затем, когда вы хотите, чтобы строка 1 была сверху, вы просто меняете высоту строки 0 на 0, а строки 1 на etc 150. Когда вам нужна строка 0, вы присваиваете ей высоту 150, а строке 1 — высоту 0. У кого-нибудь есть лучшее решение?

Ответ №1:

Если я понимаю вашу проблему / вопрос, вы фактически пытаетесь скрыть текстовый блок / список в зависимости от того, есть ли содержимое в списке; самый простой способ сделать это — использовать 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 amp;amp; (bool)value) ? Visibility.Collapsed : Visibility.Visible;
        }

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

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

В словаре ресурсов (который зарегистрирован в вашем App.xaml) определите конвертеры с подходящими вам именами (только в моем примере)

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

Обновите свой XAML, чтобы использовать конвертер следующим образом:

 <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>
  

В вашей модели я предполагаю, что у вас есть свойство bool для ShowNoGolferMessage, поэтому, когда вы получаете запрос golfer make, вы вызываете NotifyOfPropertyChange(() => ShowNoGolferMessage) в установщике.

Еще одно предложение, которое я бы сделал, заключается в том, что вы привязываетесь к какому-либо IEnumerable — здесь есть хороший пример от qmatteo, который довольно полезен (его сайт полон самородков!): qmatteoq.com Дневник разработчика Windows Phone