使用Caliburn Micro将网格绑定到变量

本文关键字:绑定 变量 网格 Caliburn Micro 使用 | 更新日期: 2023-09-27 18:09:43

所以我用Caliburn微框架创建了这个windows phone项目。我的目标是以编程方式能够替换网格行的内容。或者只是在网格的顶部添加一个新行,所以不是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">

但是我不能让它工作。然后我尝试设置一个绑定到griddatacontext:

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

在这两种情况下,我的golfergrid结果都是空的。我的golfergrid是这样的:

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

我已经为此挣扎了一段时间了,我希望得到一些帮助

使用Caliburn Micro将网格绑定到变量

如果我理解你的问题/问题,你是有效地试图隐藏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" />

更新您的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>

在你的模型中,我假设你有一个ShowNoGolferMessage的bool属性,所以当你得到golfer make suer时,你在setter中调用NotifyOfPropertyChange(() => ShowNoGolferMessage)。

我的另一个建议是,你可以绑定到某种类型的IEnumerable——这里有一个很好的例子,qmatteo非常有用(他的网站充满了黄金!):qmatteoq.com一个Windows Phone开发人员的日记