Вопрос о привязке данных Silverlight

#silverlight #xaml #data-binding #boolean

#silverlight #xaml #привязка данных #логическое

Вопрос:

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

я откопал его до

IsEnabled=»{ИмяэлемЕнта привязки=TextBoxConsumer, путь=Text.Length}»

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

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

Ответ №1:

Я бы предпочел использовать для этого класс 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"/>
  

Ответ №2:

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

 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 amp;amp; 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.

Комментарии:

1. эй, Джон, я бы хотел, чтобы кнопка включалась, когда длина текста текстового поля больше 3, я могу сделать это с помощью кода, да, но я хочу сделать это полностью с помощью привязки данных, используя конвертеры из Text.Length > 3 в значение bool в xaml, а конвертеры — это код, возможно ли это? можете ли вы привести мне пример?