Перво-наперво, лучше всего инициализировать вашу Core ViewModel даже до того, как пользовательский интерфейс будет полностью загружен, это просто делает связывание более плавным.
Для этого создайте объект Datacontext в XAML. внутри
<MainPage.DataContext>
<yourviewmodelnamespace:YourViewModel/>
</MainPage.DataContext>
<Grid>
etc....
для защиты вашего dataconext создайте свойство Get only внутри класса Page, например
public YourViewModel mydatacontext{
get{
return DataContext as YourViewModel;}
}
С учетом сказанного и выполненного, давайте упростим это.
Вам нужна только одна привязка свойства, и поскольку у вас есть только 2 варианта, вместо этого вы должны использовать два флажка друг над другом, первый флажок будет привязан к обычному значению свойства, а другой флажок будет противоположным .
Обратите внимание, что флажки IsChecked на самом деле являются логическими значениями, допускающими обнуление (bool?). как уже упоминалось ранее, для достижения этой единой системы свойств вам придется использовать так называемый A Converter , который в нашем случае просто обратит входящее значение, все это может показаться сложным, но я уверяю вас, это самое чистое и самый эффективный способ достижения такой функциональности.
Пример кода:
1. YourViewModel.cs
private bool? _y;
public bool? IsYCheckboxChecked
{
get => _y;
set
{
if (value != _y)
{
_Y = value;
OnPropertyChanged();
}
}
}
- ConverterClass
namespace YourConvertNameSpace{
public Class NullBoolReverser{// this is the converter we are going to use to reverse the bool?
public object Convert(object value, Type targetType, object parameter, string language)
{
var val = (bool?)value;
return !val;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
var val = (bool?)value;
return !val;
}
}
}
- MainPage.xaml
<MainPage.Resources>
<YourConvertNameSpace:NullBoolReverser x:Key="MyReverserKey"/>
</MainPage.Resources>
<MainPage.DataContext>
<your datacontextgoes here, like i showed before, it will be accessed by a get only prop called 'mydatacontext'>
</MainPage.DataContext>
<Grid>
<StackPanel
<CheckBox Name="Ycheckbox" IsChecked="{x:Bind 'mydatacontext.IsYCheckboxChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
This is Y
</CheckBox
<CheckBox IsChecked="{x:Bind Ycheckbox.IsChecked, Converter={StaticResource MyReverserKey}, Mode=TwoWay}">
This is X
</CheckBox><!--This Bind Allows a and exclusive clause between the two cheboxes thanks to the nullbool reverser-->
</StackPanel
</Grid
</Page>
это все написано в верхней части головы и на ноге, поэтому извините за форматирование, редактор слишком тусклый и неуклюжий, не разбивайте выражения связывания на разные строки, даже если они кажутся многострочными.
Редактирование: сборка Построить свой проект полезно после каждого шага, поскольку очень часто элементы, не относящиеся к пользовательскому фреймворку, такие как простой класс или конвертер, не сразу распознаются редактором xaml.