【问题标题】:Silverlight: Difficulty with binding to visiblitySilverlight:难以绑定可见性
【发布时间】:2010-11-30 22:29:00
【问题描述】:

我有两个元素:一个列表框和一个“此列表为空”消息。我想将它们的可见性绑定到列表框的ItemsSource 为空。但是,我不确定该怎么做:

        <TextBlock Text="No favorite searches yet. Add some by searching, then clicking 'Add to Favorites'" 
                   Padding="10,0" 
                   VerticalAlignment="Center"
                   Visibility="{Binding Path=FavoriteFilters.IsEmpty, Converter={StaticResource visibilityConverter}}"
                   />

        <ListBox ItemsSource="FavoriteFilters" 
                 x:Name="favoriteFiltersList" 
                 Visibility="{Binding Path=FavoriteFilters.IsEmpty, Converter={StaticResource visibilityConverter}}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <my:FavoriteFilterLink />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

它们都是可见的,尽管ItemsSource 是空的。另外,我不确定如何反转ListBox 的条件。

可见性转换器:

public class VisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is bool?)
        {
            if (string.IsNullOrEmpty((string)parameter))
            {
                return (value as bool?).Value ? Visibility.Visible : Visibility.Collapsed;
            } else
            {
                return (value as bool?).Value ? Visibility.Collapsed : Visibility.Visible;
            }
        }
        throw new ArgumentException();
    }

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

【问题讨论】:

    标签: c# silverlight xaml


    【解决方案1】:

    最好编写两个转换器,一个用于 ListBox,另一个用于 TextBlock。每个的逻辑会更简单,您无需传递参数即可获得正确的结果。

    虽然它可能不如单个转换器解决方案那么优雅,但它更易于维护。

    如果你真的想传递一个参数,那么你需要使用ConverterParameter

    有一个示例here,但我不能 100% 确定它会满足您的要求。简化的 XAML 语法是:

    <TextBlock Visibility="{Binding FavoriteFilters.IsEmpty,
         Converter={StaticResource visibilityConverter}, ConverterParameter=false}"/>
    
    <ListBox Visibility="{Binding FavoriteFilters.IsEmpty,
         Converter={StaticResource visibilityConverter}, ConverterParameter=true}"/>
    

    然后在您的转换器中(简化):

    bool show = (bool)value;
    bool visible = (bool)parameter;
    if (visible)
    {
        return show ? Visibility.Visible : Visibility.Collapsed;
    }
    else
    {
        return show ? Visibility.Collapsed : Visibility.Visible;
    }
    

    【讨论】:

    • 如果我愿意,如何将参数传递给转换器?
    • 谢谢。我认为链接已损坏。
    • @Rosarch - 我删除了链接,因为我认为它提供的信息不正确。我正在努力寻找一个很好的例子(我有一些代码在工作,但我在家,所以我目前无法访问)。
    • 好的,谢谢你的例子。但我仍然在绑定方面遇到问题。转换器方法中的断点未命中。我的绑定语法有问题吗?
    • @Rosarch - 我不确定。看起来它应该工作。可能值得尝试首先绑定到不同的属性以使逻辑正常工作。然后,您可以在视图模型中将该属性设置为 FavoriteFilters.IsEmpty,或者尝试让它直接工作。
    猜你喜欢
    • 2010-11-02
    • 2012-06-12
    • 1970-01-01
    • 2012-01-16
    • 2010-11-14
    • 2013-12-13
    • 1970-01-01
    • 2014-08-20
    • 2011-12-18
    相关资源
    最近更新 更多