- Visual Studio Community Edition 2015
- Net 4,0
Ho implementato this answer, producendo il mio CheckBox
classe completo di una IsChecked
DependencyProperty
. Quella proprietà è supportata dalla proprietà IsChecked
sul WPF CheckBox
o sarebbe se funzionasse. Lavorare significherebbe che il mio getter e setter vengono chiamati quando la casella di controllo è attivata.
Se rinominare la proprietà su IsChecked_temp
e modificare XAML in modo che corrisponda, funziona correttamente. Penso che questo sia un conflitto di denominazione, ma perché non lo risolve ElementName
? Segue il mio caso di test minimale.
MODIFICA 0: ho dimenticato di menzionare, non ricevo errori o avvisi.
EDIT 1: This answer è stato inizialmente accettato perché funziona per il caso di test, ma apparentemente non è l'intera risposta. Applicandola al mio progetto (e rinominare la classe CheckBox
a ToggleBox
) produce un XamlParseException
ad ogni utilizzo della proprietà:
A 'vincolante' non può essere impostato sulla proprietà 'IsChecked' di tipo 'ToggleBox'. Un 'Binding' può essere impostato solo su una DependencyProperty di DependencyObject.
Cercherò di ottenere un test case minimale che mostri questo.
CheckBox.xaml
<UserControl x:Class="CheckBox_test.CheckBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Self">
<StackPanel>
<CheckBox IsChecked="{Binding IsChecked, ElementName=Self}" />
</StackPanel>
</UserControl>
CheckBox.xaml.cs
using System.Windows;
using System.Windows.Controls;
namespace CheckBox_test
{
public partial class CheckBox : UserControl
{
public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(
"IsChecked",
typeof(bool),
typeof(CheckBox),
new FrameworkPropertyMetadata(false,
FrameworkPropertyMetadataOptions.AffectsRender));
public bool IsChecked
{
get { return (bool)GetValue(IsCheckedProperty); }
set { SetValue(IsCheckedProperty, value); }
}
public CheckBox()
{
InitializeComponent();
}
}
}
MainWindow.xaml
<Window x:Class="CheckBox_test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CheckBox_test">
<Grid>
<local:CheckBox />
</Grid>
</Window>
MainWindow.xaml.cs (per completezza)
using System.Windows;
namespace CheckBox_test
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
Proprio per la prova, cerco di scrivere IsChecked = "{Binding Path = IsChecked, ElementName = self}" – Spawn
@Spawn L'ho provato con e senza '_temp' e ho ottenuto gli stessi risultati. Vale la pena provare, quindi grazie. – Grault
Ok, ci proverò domani ... Self non è un nome così raro per UserControl, quindi deve funzionare. Puoi dire quale versione di Visual Studio e .NET usi? – Spawn