#c# #xaml #data-binding
#c# #xaml #привязка данных
Вопрос:
В настоящее время я работаю над тем, как использовать XAML и как он взаимодействует с C #. Моя текущая задача — попытаться заставить текстовый блок изменять текст, который он отображает, когда установлен флажок. Для этого требуется, чтобы программа принимала ввод Bool (флажок установлен?) и выдать строковый вывод.
В настоящее время, когда он запускается, макет правильный, что заставляет меня подозревать, что код XAML в порядке, однако textblock будет отображать только состояние «без галочки», независимо от того, установлен флажок или нет.
Я подозреваю, что проблема заключается в двух методах, но я не могу найти решение, какие-либо предложения?
Рассматриваемый код: C#
public class MainPageViewModel : ViewModelBase
{
//stores value of checkbox
private bool _BoxCheckBool;
//Updates value of _BoxCheckBool
public bool BoxCheckBool
{
set
{
Set(ref _BoxCheckBool, value);
}
}
//stores value (for textblock)
private string _BoxCheckString;
public string BoxCheckString
{
//logic that determines what will be sent to the textblock
get
{
if (_BoxCheckBool == true)
{
_BoxCheckString = "The Box has been checked";
}
else if (_BoxCheckBool == false)
{
_BoxCheckString = "The Box has not been checked";
}
else
{
_BoxCheckString = "ERROR";
}
return _BoxCheckString;
}
set
{
Set(ref _BoxCheckString, value);
}
}
}
Рассматриваемый код: XAML
<CheckBox x:Name="BoxTest" HorizontalAlignment="Center" Content="Check Box" IsChecked="{Binding BoxCheckBool, Mode=TwoWay}"/>
<TextBlock x:Name="BoxTestOutput" Grid.Row="1" Text="{Binding BoxCheckString, Mode=TwoWay}"/>
Комментарии:
1. Спасибо всем за ваши советы, это было очень полезно. 🙂
Ответ №1:
Вам нужно только вызвать PropertyChanged
событие при bool
изменении свойства. Пользовательский интерфейс будет обновляться автоматически
public class MainPageViewModel : ViewModelBase
{
//stores value of checkbox
private bool _BoxCheckBool;
//Updates value of _BoxCheckBool
public bool BoxCheckBool
{
set
{
Set(ref _BoxCheckBool, value);
// Assumes your ViewModelBase have method to raising this
RaisePropertyChanged("BoxCheckString");
}
}
private string _BoxCheckString;
public string BoxCheckString
{
//logic that determines what will be sent to the textblock
get
{
if (_BoxCheckBool == true)
{
_BoxCheckString = "The Box has been checked";
}
else
{
_BoxCheckString = "The Box has not been checked";
}
// Boolean type have only two value (true/false)
// - you don't need checking for "errors"
return _BoxCheckString;
}
set
{
Set(ref _BoxCheckString, value);
}
}
}
Ответ №2:
Текстовый блок не обновлялся, потому что при изменении значения не было уведомления.
Чтобы выполнить обновление привязки, вам необходимо реализовать уведомление об изменении свойств (пожалуйста, ознакомьтесь с этой ссылкой). Вам нужно вызвать что-то вроде OnPropertyChanged("BoxCheckString")
(в зависимости от вашего ViewModelBase
) внутри установщика BoxCheckBool
, чтобы текстовый блок знал, что требуется обновление.
Комментарии:
1. Ах, хорошо. Из интереса нужно ли мне также указывать второму методу проверять наличие обновлений или текстовый блок, ссылающийся на него, автоматически заставляет его это делать?
2. Просто убедитесь, что
PropertyChanged
событие вызывается дляBoxCheckString
afterBoxCheckString
обновляется до желаемого значения, поэтому текстовый блок может быть максимально обновленBoxCheckString
. Текстовый блок будет обновляться автоматически для каждогоPropertyChanged
событияBoxCheckString
.
Ответ №3:
Вы меняете текстовое значение в неправильном месте:
ViewModel:
private bool _BoxCheckBool;
//Updates value of _BoxCheckBool
public bool BoxCheckBool
{
get
{
return _BoxCheckBool;
}
set
{
_BoxCheckBool = value;
OnPropertyChanged("BoxCheckBool");
if (_BoxCheckBool == true)
{
BoxCheckString = "The Box has been checked";
}
else if (_BoxCheckBool == false)
{
BoxCheckString = "The Box has not been checked";
}
else
{
BoxCheckString = "ERROR";
}
}
}
//stores value (for textblock)
private string _BoxCheckString = "";
public string BoxCheckString
{
//logic that determines what will be sent to the textblock
get
{
return _BoxCheckString;
}
set
{
_BoxCheckString = value;
OnPropertyChanged("BoxCheckString");
}
}
Xaml:
<StackPanel Orientation="Horizontal">
<CheckBox Name="BoxTest" IsChecked="{Binding BoxCheckBool, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" HorizontalAlignment="Center" />
<ContentPresenter Content="{Binding BoxCheckString, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>