将IsEnabled属性绑定到文本块是否包含数据

obe*_*lix 1 silverlight windows-phone-7

我正在为windows phone使用silverlight,我想将按钮的IsEnabled属性绑定到文本块是否包含文本.换句话说,我希望当文本块的Text不为空时启用我的按钮,否则禁用.

是否可以使用样式/设置器/触发器或任何其他机制纯粹在XAML中执行此操作,还是必须编写转换器?

PS:我还在学习Silverlight,.NET等.

Gon*_*ing 6

由于类型不兼容(并且您通常希望避免代码隐藏/依赖属性),"启用字符串的转换器"是此类简单检查的最佳选择.

由于转换器是围绕项目共享的,并且只是XAML中的一个小条目(并且没有对代码隐藏的更改),所以您不应该担心使用转换器... 转换器是您的朋友 :)

开始制作有用的转换器库,因为同样的问题会一次又一次地出现.

下面是一些转换器的最小代码(无错误检查),可以执行您想要的操作:

using System;
using System.Windows.Data;

namespace LengthToEnabledTest
{
    public class LengthToEnabledConverter : IValueConverter
    {

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is string)
            {
                return (value as string).Length > 0;
            }
            throw new NotImplementedException();
        }

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

        #endregion
    }
}
Run Code Online (Sandbox Code Playgroud)

和一些匹配测试XAML(一个带有1个文本框和1个按钮的简单堆栈面板):

<UserControl x:Class="TransitioningContentContolTest.LengthEnabledTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:converter="clr-namespace:LengthToEnabledTest"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <UserControl.Resources>
        <converter:LengthToEnabledConverter x:Key="LengthToEnabledConverter"/>
    </UserControl.Resources>
    <StackPanel x:Name="LayoutRoot" Background="White">
        <TextBox x:Name="textBox" />
        <Button Content="Press me" Height="20" IsEnabled="{Binding Text, ElementName=textBox, Converter={StaticResource LengthToEnabledConverter}}"/>
    </StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)