Zastosowanie:XAML: Jak powiązać właściwość DependencyProperty z właściwością C# o tej samej nazwie na innym obiekcie?
- Visual Studio Community Edition 2015
- Net 4,0
I zostały wdrożone this answer, produkując własne CheckBox
klasę komplecie z IsChecked
DependencyProperty
. Ta właściwość jest wspierana przez właściwość IsChecked
na WPF CheckBox
lub byłaby, gdyby działała. Praca oznaczałaby, że mój odbiorca i seter są wywoływani, gdy pole wyboru jest przełączane.
Jeśli zmienię nazwę mojej nieruchomości na IsChecked_temp
i zmodyfikuję XAML tak, aby pasowała, działa dobrze. Myślę, że to konflikt nazw, ale dlaczego go nie rozwiąże? Mój minimalny przypadek testowy następuje.
EDYCJA 0: Zapomniałem wspomnieć, nie otrzymuję żadnych błędów ani ostrzeżeń.
EDIT 1: This answer został początkowo zaakceptowany, ponieważ działa w przypadku testowym, ale najwyraźniej nie jest to cała odpowiedź. Stosując ją do mojego projektu (i zmiana nazwy klasy CheckBox
do ToggleBox
) daje XamlParseException
przy każdym użyciu nieruchomości:
A „wiążące” nie można ustawić na własność „IsChecked” typu „ToggleBox”. "Powiązanie" można ustawić tylko na DependencyProperty obiektu DependencyObject.
Postaram się uzyskać minimalny przykład testowy, aby to pokazać.
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 (dla kompletności)
using System.Windows;
namespace CheckBox_test
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
Tylko dla testu, spróbuj napisać IsChecked = "{Binding Path = IsChecked, ElementName = self}" – Spawn
@Spawn Próbowałem tego zi bez '_temp' i otrzymałem takie same wyniki. Warto spróbować, więc dzięki. – Grault
OK, spróbuję jutro ... Self nie jest tak rzadką nazwą UserControl, więc musi działać. Czy możesz powiedzieć, jakich wersji Visual Studio i .NET używasz? – Spawn