Co widzę tutaj jest to, że nazwa klasy okna jest Main
, że dodasz właściwość RecordProp
do niego i że jesteś teraz próbuje połączyć się z właściwością o nazwie RecordProp
. Myślę, że jesteś trochę zdezorientowany, jak działają nazwy.
Dodanie atrybutu x:Name
do elementu XAML tworzy pole w klasie okna o tej nazwie. To pozwala ci odwoływać się do nazwanych elementów w twoim kodzie i prawdopodobnie doprowadziło cię do przekonania, że wiązanie może zrobić to samo.
Ale to nie jest sposób wiązania znalezionych nazwanych elementów. Atrybut x:Name
także przenosi obiekt, który element XAML tworzy i rejestruje pod tą nazwą w oknie imiennym okna. (Zobacz MSDN's article on XAML namescopes.) To właśnie wygląda na powiązanie, aby rozwiązać nazwy elementów. Ponieważ nigdy nie dodajesz obiektu do namescope, ustawienie właściwości ElementName
na powiązaniu nie spowoduje jej znalezienia.
Jest kilka rzeczy, które można zrobić. Jeśli naprawdę chcą wiązać się z majątku oknie można nadać oknu nazwę i wiążą się z posesji przy użyciu ścieżki właściwość:
<Window x:Name="MainWindow" x:Class="Main">
...
<customcontrol Name="View" IsChecked="
{Binding ElementName=MainWindow,
Path=RecordProp.IsViewChecked}" />
Jeszcze prostsze jest po prostu ustawić kontekstu danych w konstruktorze:
DataContext = this;
Gdy to zrobisz, możesz po prostu powiązać z właściwością RecordProp
(i innej własności okna) jak poniżej:
<customControl Name="View" IsChecked={Binding RecordProp.IsChecked}/>
oczywiście, że nie będzie działać, jeśli yo Potrzebujesz kontekst danych okna, aby ustawić coś innego.
Inną możliwością jest wprowadzenie własności takiego:
public Record RecordProp
{
get { return (Record)Resources["RecordProp"]; }
set { Resources["RecordProp"] = value; }
}
można powiązać to z użyciem (na przykład) Binding {DynamicResource RecordProp}, Path=IsChecked"
.Ponieważ jest to zasób dynamiczny, jeśli coś poza oknem ustawia jego właściwość, odradzą się wiązania - co nie będzie miało miejsca, jeśli po prostu ustawisz właściwość jako własność (chyba że zaimplementujesz powiadomienie o zmianie).
Właściwość publiczna nie miała żadnego wpływu. – jaws
@ user258651 Wydaje mi się, że musisz zaktualizować kontekst bindowania, aby okno główne domyślnie powróciło do klasy głównej. Minęło trochę czasu, odkąd na to patrzyłem. – JaredPar