#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, а конвертеры — это код, возможно ли это? можете ли вы привести мне пример?