如何实现一个BoolToVisibilityConverter [英] How to Implement a BoolToVisibilityConverter

查看:249
本文介绍了如何实现一个BoolToVisibilityConverter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序,我想切换在StackPanel的项目的知名度。我StackPanel中包含一个图像和一个TextBlock。我将如何正确使用BoolToVisibilityConverter切换TextBlock的知名度,并保存设置为用户受益?



目前我有什么情况如下,虽然我得到了一些错误。重要提示,我需要使用的应用程序任务栏菜单项作为驱动文本框的可见性的来回切换的单击事件。



修改



错误不再发生,尽管TextBlock的知名度并没有改变。



XAML

 的xmlns:普通=CLR的命名空间:TestApp.Common

<电话:PhoneApplicationPage.Resources>
<普通:BooleanToVisibilityConverter X:键=BoolToVisConv/>
< /电话:PhoneApplicationPage.Resources>

<列表框名称=ListBoxEffects的SelectionMode =单的ItemsSource ={结合}保证金={结合}
工具箱:TiltEffect.IsTiltEnabled =真的SelectionChanged = ListBox_SelectionChanged
ItemContainerStyle ={StaticResource的ListBoxItemStyle1}>
< ListBox.ItemsPanel>
< ItemsPanelTemplate>
<工具箱:WrapPanel ItemWidth =159ItemHeight =自动/>
< / ItemsPanelTemplate>
< /ListBox.ItemsPanel>
< ListBox.ItemTemplate>
<&DataTemplate的GT;
< StackPanel的方向=垂直>
<图像来源={结合缩略图}WIDTH =155HEIGHT =155/>
< TextBlock的文本={结合名}能见度={结合IsTextBlockVisible,转换器= {StaticResource的BoolToVisConv}}TextWrapping =自动换行字号={StaticResource的PhoneFontSizeNormal}VerticalAlignment =中心的Horizo​​ntalAlignment = 中心/>
< / StackPanel的>
< / DataTemplate中>
< /ListBox.ItemTemplate>
< /列表框>



代码隐藏

 私人无效BuildLocalizedApplicationBar()
{
=应用程序任务新应用程序任务栏();

ApplicationBarMenuItem showFilterNamesMenuItem =新ApplicationBarMenuItem();
如果(Settings.ShowFilterNames.Value)
showFilterNamesMenuItem.Text = AppResources.EditPage_EffectNames_Hide;
,否则
showFilterNamesMenuItem.Text = AppResources.EditPage_EffectNames_Show;
showFilterNamesMenuItem.Click + = showFilterNamesMenuItem_Click;
ApplicationBar.MenuItems.Add(showFilterNamesMenuItem);
}

无效showFilterNamesMenuItem_Click(对象发件人,EventArgs五)
{
如果(Settings.ShowFilterNames.Value)
{
(( ApplicationBarMenuItem)ApplicationBar.MenuItems [0])文本= AppResources.EditPage_EffectNames_Hide。
Settings.ShowFilterNames.Value = FALSE;

//切换文本块知名度,这里
}
,否则
{
((ApplicationBarMenuItem)ApplicationBar.MenuItems [0])。文本= AppResources.EditPage_EffectNames_Show;
Settings.ShowFilterNames.Value = TRUE;

//切换文本块知名度,这里
}
}

一个为BooleanToVisibilityConverter

在BooleanToVisibilityConverter说明未实现接口成员'System.Windows  // Error类.Data.IValueConverter.Convert(对象的System.Type,对象,System.Globalization.CultureInfo)
公共类BooleanToVisibilityConverter:的IValueConverter
{

公共类BooleanToVisibilityConverter:的IValueConverter
{
公共对象转换(对象的值,类型TARGETTYPE,对象参数,CultureInfo的语言)
{
回报率(值是布尔和放大器;及(布尔)值)? Visibility.Visible:Visibility.Collapsed;
}
公共对象ConvertBack(对象的值,类型TARGETTYPE,对象参数,CultureInfo的语言)
{
返回值是能见度和放大器;&安培; (能见度)值== Visibility.Visible;
}
}


解决方案

尝试这样的:

 公共类BooleanToVisibilityConverter:的IValueConverter 
{
私有对象GetVisibility(对象的值)
{
如果
返回Visibility.Collapsed((值是布尔)!);
布尔objValue =(布尔)值;
如果(objValue)
{
返回Visibility.Visible;
}
返回Visibility.Collapsed;
}
公共对象转换(对象的值,类型TARGETTYPE,对象参数,字符串语言)
{
返回GetVisibility(值);
}
公共对象ConvertBack(对象的值,类型TARGETTYPE,对象参数,字符串语言)
{
抛出新NotImplementedException();
}


}


In my app I would like to toggle the visibility of an item in a StackPanel. My Stackpanel contains an Image and a TextBlock. How would I properly use a BoolToVisibilityConverter to toggle the visibility of the TextBlock, and save this setting for the users benefit?

Currently what I have is as follows, although I am getting a few errors. Important note, I need to use an ApplicationBar menu item as the click event that drives the toggling of the TextBox visibility.

EDIT

Error no longer occurring although the visibility of the TextBlock is not changing.

XAML

xmlns:common="clr-namespace:TestApp.Common"

<phone:PhoneApplicationPage.Resources>
    <common:BooleanToVisibilityConverter x:Key="BoolToVisConv" />
</phone:PhoneApplicationPage.Resources>

<ListBox Name="ListBoxEffects" SelectionMode="Single" ItemsSource="{Binding}" Margin="{Binding}"
                     toolkit:TiltEffect.IsTiltEnabled="True" SelectionChanged="ListBox_SelectionChanged" 
                         ItemContainerStyle="{StaticResource ListBoxItemStyle1}">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <toolkit:WrapPanel ItemWidth="159" ItemHeight="Auto" />
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Vertical"  >
                                <Image Source="{Binding Thumbnail}" Width="155" Height="155" />
                                <TextBlock Text="{Binding Name}" Visibility="{Binding IsTextBlockVisible, Converter={StaticResource BoolToVisConv}}"  TextWrapping="Wrap" FontSize="{StaticResource PhoneFontSizeNormal}" VerticalAlignment="Center" HorizontalAlignment="Center" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

Code Behind

private void BuildLocalizedApplicationBar()
    {
        ApplicationBar = new ApplicationBar();

        ApplicationBarMenuItem showFilterNamesMenuItem = new ApplicationBarMenuItem();
        if (Settings.ShowFilterNames.Value)
            showFilterNamesMenuItem.Text = AppResources.EditPage_EffectNames_Hide;
        else
            showFilterNamesMenuItem.Text = AppResources.EditPage_EffectNames_Show;
        showFilterNamesMenuItem.Click += showFilterNamesMenuItem_Click;
        ApplicationBar.MenuItems.Add(showFilterNamesMenuItem);
    }

void showFilterNamesMenuItem_Click(object sender, EventArgs e)
    {
        if(Settings.ShowFilterNames.Value)
        {
            ((ApplicationBarMenuItem)ApplicationBar.MenuItems[0]).Text = AppResources.EditPage_EffectNames_Hide;
            Settings.ShowFilterNames.Value = false;

            //Toggle the text block visibility to here
        }
        else
        {
            ((ApplicationBarMenuItem)ApplicationBar.MenuItems[0]).Text = AppResources.EditPage_EffectNames_Show;
            Settings.ShowFilterNames.Value = true;

            //Toggle the text block visibility to here
        }               
    }

A class for the BooleanToVisibilityConverter

//Error on BooleanToVisibilityConverter stating does not implement interface member 'System.Windows.Data.IValueConverter.Convert(object, System.Type, object, System.Globalization.CultureInfo)
public class BooleanToVisibilityConverter : IValueConverter   
{   

public class BooleanToVisibilityConverter : IValueConverter   
{   
    public object Convert(object value, Type targetType, object parameter, CultureInfo language)      
    {      
        return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed;      
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo language)      
    {      
        return value is Visibility && (Visibility)value == Visibility.Visible;      
    }   
}

解决方案

Try this:

public class BooleanToVisibilityConverter : IValueConverter
{
    private object GetVisibility(object value)
    {
        if (!(value is bool))
            return Visibility.Collapsed;
        bool objValue = (bool)value;
        if (objValue)
        {
            return Visibility.Visible;
        }
        return Visibility.Collapsed;
    }
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return GetVisibility(value);
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }


}

这篇关于如何实现一个BoolToVisibilityConverter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆