Próbuję nauczyć się korzystać z wiązania WPF i architektury MVVM. Mam problemy z Właściwościami Dependency. Próbowałem kontrolować widoczność elementu w widoku, wiążąc go z DependencyProperty w DataContext, ale to nie działa. Bez względu na to, jak ustawię wartość GridVisible
w konstruktorze poniższego modelu widoku, jest on zawsze wyświetlany jako widoczny po uruchomieniu kodu.Architektura wiązania danych WPF Pytanie
Czy ktoś może zobaczyć, gdzie się źle dzieje?
kod C# (ViewModel):
public class MyViewModel : DependencyObject
{
public MyViewModel()
{
GridVisible = false;
}
public static readonly DependencyProperty GridVisibleProperty =
DependencyProperty.Register(
"GridVisible",
typeof(bool),
typeof(MyViewModel),
new PropertyMetadata(false,
new PropertyChangedCallback(GridVisibleChangedCallback)));
public bool GridVisible
{
get { return (bool)GetValue(GridVisibleProperty); }
set { SetValue(GridVisibleProperty, value); }
}
protected static void GridVisibleChangedCallback(
DependencyObject source,
DependencyPropertyChangedEventArgs e)
{
// Do other stuff in response to the data change.
}
}
kod XAML (Widok):
<UserControl ... >
<UserControl.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter" />
</UserControl.Resources>
<UserControl.DataContext>
<local:MyViewModel x:Name="myViewModel" />
</UserControl.DataContext>
<Grid x:Name="_myGrid"
Visibility="{Binding Path=GridVisible,
ElementName=myViewModel,
Converter={StaticResource BoolToVisConverter}}">
<!-- Other elements in here -->
</Grid>
</UserControl>
Szukałem w kilku samouczki online, a wydaje się, że jestem poprawnie podążając za tym, co tam znalazłem. Jakieś pomysły? Dzięki!
Właściwie skopiowałem Twój kod i stwierdziłem, że działało z wiązaniem zi bez elementu ElementName. Do czego używasz kontrolki użytkownika (np. Okna lub innej kontroli użytkownika)? Być może coś jest nie tak (kod, którego nie uwzględniłeś). – thornhill
Usunąłem elementName i nadal nie działa. Wygląda jednak na to, że masz rację - prawdopodobnie ma to coś wspólnego z inną częścią mojego kodu, a nie z odkażoną wersją zamieszczoną powyżej. Niestety nie mogę opublikować rzeczywistego kodu, ponieważ jest on przeznaczony do pracy. – RobotNerd
W takim przypadku, gdy używasz aplikacji i masz otwarte okno, które zawiera tę kontrolę użytkownika, zajrzyj do okna wyjściowego w VisualStudio w poszukiwaniu błędów z tekstem podobnym do tego "Błąd ścieżki BindingExpression: właściwość" GridVisible "nie została znaleziona na "object ......" Treść tego komunikatu może pomóc w dalszym debugowaniu. Przepraszam, nie mogę ci pomóc. powodzenia. – thornhill