Вопрос привязки данных Silverlight - PullRequest
0 голосов
/ 10 июня 2011

У меня есть TextBox (TextBoxConsumer), и я хотел бы включить кнопку в моем пользовательском интерфейсе, когда длина TextBox.Text превышает 3,

я выкопал его до

IsEnabled = "{Binding ElementName = TextBoxConsumer, Path = Text.Length} "

для свойства моей кнопки IsEnabled, но я не уверен, как найти длину и преобразовать ее в bool в зависимости от длины текстового поля, как мне это сделать?

Я хотел бы сделать это полностью на Xaml вместо кода, используя Binding вместо кода

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Я бы предпочел использовать для этого класс IValueConverter. Я предоставлю быстрый код, хотя его не совсем то, что вы ищете, вы должны его настроить.

В отдельном файле cs:

using System;
using System.Globalization;
using System.Windows.Data;

public class IntCorrectAnswerToTrueFalseConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (int)value > 0;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value ? 1 : 0;
    }
}

В App.xaml добавьте эту строку в ResourceDictionary:

<app:IntCorrectAnswerToTrueFalseConverter x:Key="IntCorrectAnswerToTrueFalseConverter" />

Тогда в xaml того, где вы его используете:

<CheckBox 
x:Name="answerCheckBox" 
IsChecked="{Binding Score, Converter={StaticResource IntCorrectAnswerToTrueFalseConverter}}"
Click="CheckBoxChecked"/>
0 голосов
/ 10 июня 2011

Я сделал нечто подобное, используя учебник, похожий на this , используя интерфейс INotifyPropertyChanged. Я предполагаю, что у вас есть модель, которую вы используете для привязки к пользовательскому интерфейсу. У вас есть строковый член (например, TextBoxConsumerString), который привязывает вас к текстовому полю. Теперь вам нужно добавить логическое значение типа TextBoxConsumerEnabled, которое вы будете устанавливать внутри установщика TextBoxConsumerString и вызывать метод уведомления об изменении.

this.OnPropertyChanged( new PropertyChangedEventArgs( "TextBoxConsumerEnabled" ) ); 

Вот пример:

public class TextBoxConsumerModel : INotifyPropertyChanged
{
    private string _textBoxConsumerString;
    public event PropertyChangedEventHandler PropertyChanged;

    public string TextBoxConsumerString
    {
        get
        {
            return _textBoxConsumerString;
        }
        set
        {
            if (_textBoxConsumerString == value)
                return;

            TextBoxConsumerEnabled = value != null && value.Length > 3;

            _textBoxConsumerString = value;
            OnPropertyChanged(new PropertyChangedEventArgs("TextBoxConsumerEnabled"));
        }
    }

    public bool TextBoxConsumerEnabled { get; set; }

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, e);
    }
}

Это должно быть так, насколько модель идет. Теперь вам просто нужно привязать два свойства модели из XAML.

...