C# WPF数据绑定体系结构问题

C# WPF数据绑定体系结构问题,c#,wpf,xaml,dependency-properties,datacontext,C#,Wpf,Xaml,Dependency Properties,Datacontext,我试图学习如何使用WPF绑定和MVVM体系结构。我在依赖属性方面遇到了一些问题。我试图通过将某个项绑定到DataContext中的DependencyProperty来控制该项在视图中的可见性,但它不起作用。无论我在下面视图模型的构造函数中将GridVisible值设置为什么,在运行代码时它始终显示为可见 有人能看出我哪里做错了吗 C#代码(视图模型): XAML代码(视图): 我在网上看了几篇教程,似乎我正确地遵循了我在那里找到的内容。有什么想法吗?谢谢 将ElementName从绑定中去

我试图学习如何使用WPF绑定和MVVM体系结构。我在依赖属性方面遇到了一些问题。我试图通过将某个项绑定到DataContext中的DependencyProperty来控制该项在视图中的可见性,但它不起作用。无论我在下面视图模型的构造函数中将
GridVisible
值设置为什么,在运行代码时它始终显示为可见

有人能看出我哪里做错了吗

C#代码(视图模型):

XAML代码(视图):



我在网上看了几篇教程,似乎我正确地遵循了我在那里找到的内容。有什么想法吗?谢谢

将ElementName从绑定中去掉,这似乎不正确。 将其更改为:

<Grid x:Name="_myGrid"
        Visibility="{Binding Path=GridVisible,
            Converter={StaticResource BoolToVisConverter}}">

将ViewModel设置为DataContext的目的是启用简单的相对绑定,所有仅指定
路径的绑定都将DataContext作为源,该源在整个UserControl中继承(除非另外设置,例如在ItemsControl的模板项中)

因此,一旦在UserControl上设置了DataContext,您在绑定到VM时通常不会指定任何源。(来源为
ElementName
相对来源
来源


此外,我个人不会让ViewModels继承自
DependencyObject
,因为这引入了线程亲和力,DependencyProperties的要点是通过不在所有数据结构中创建不必要的字段来提高稀疏数据结构的效率(ViewModels通常与稀疏相反).

让您的ViewModel实现INotifyPropertyChanged,而不是从DependencyObject继承。 实现接口并从属性的setter中引发PropertyChanged

    private bool gridVisible;

    public bool GridVisible
    {
        get { return gridVisible; }
        set 
        { 
            gridVisible = value; 
            OnPropertyChanged("GridVisible"); 
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

实际上,我复制了您的代码,发现它与包含和不包含ElementName的绑定一起工作。你在什么地方使用用户控件(如窗口或其他用户控件)?可能有什么地方出错了(代码您没有包括在内)。我删除了ElementName,但它仍然不起作用。但看起来你是对的——这可能与我代码的另一部分有关,而不是上面发布的经过净化的版本。不幸的是,我无法发布实际代码,因为它是用于工作的。在这种情况下,当您运行应用程序并打开包含此usercontrol的窗口时,请在VisualStudio的输出窗口中查找与“BindingExpression path error:'GridVisible'属性未在“object…”上找到类似文本的任何错误该消息的内容可能有助于进一步调试。对不起,我不能再帮你了。祝你好运。你是对的,那是个打字错误!在调试模式下运行时,我检查了输出窗口,发现我的一个数据绑定拼写错误。它现在工作得很好。谢谢
INotifyPropertyChanged
DependencyObject
的替代方案-大多数视图模型使用此属性而不是依赖属性。您不需要在XAML中使用ElementName引用VM,也不需要命名VM。将其分配给usercontrol.DataContext时,它将成为用户控件所有子级的默认绑定源。
<Grid x:Name="_myGrid"
        Visibility="{Binding Path=GridVisible,
            Converter={StaticResource BoolToVisConverter}}">
    private bool gridVisible;

    public bool GridVisible
    {
        get { return gridVisible; }
        set 
        { 
            gridVisible = value; 
            OnPropertyChanged("GridVisible"); 
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }