Привязка свойства IsEnabled к тому, есть ли у текстового блока данные - PullRequest
1 голос
/ 21 августа 2010

Я использую silverlight для Windows Phone и хочу связать свойство IsEnabled кнопки с тем, есть ли в текстовом блоке текст или нет. Другими словами, я хочу, чтобы моя кнопка была включена, когда текст текстового блока не пустой и отключен в противном случае.

Возможно ли сделать это исключительно в XAML, используя стили / сеттеры / триггеры или любой другой механизм, или мне нужно написать конвертер?

PS: я все еще изучаю silverlight, .NET и т.д ..

1 Ответ

6 голосов
/ 22 августа 2010

Поскольку типы несовместимы (и вы, как правило, хотите избегать свойств кода-за-базы / зависимостей), лучшим вариантом для этого типа простой проверки является «преобразователь строки в включенный».

Поскольку конвертеры совместно используются в проектах и ​​являются лишь второстепенной записью в 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
    }
}

и несколько тестов на соответствие 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...