C# CodeBehind不为ResourceDictionary工作

C# CodeBehind不为ResourceDictionary工作,c#,.net,wpf,xaml,resourcedictionary,C#,.net,Wpf,Xaml,Resourcedictionary,我想通过属性禁用WPF c#应用程序中的所有工具提示。我对我的所有窗口、用户控件等使用ResourceDictionary(MyStyle.xaml): <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/Interface;component/MyStyle.xaml" /> </ResourceDictionary.MergedDictionaries> 但绑

我想通过属性禁用WPF c#应用程序中的所有工具提示。我对我的所有窗口、用户控件等使用ResourceDictionary(MyStyle.xaml):

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Interface;component/MyStyle.xaml" />
</ResourceDictionary.MergedDictionaries>

但绑定不起作用。如果我直接在MyStyle.xaml中设置可见性而不进行绑定,它可以工作:

<Style TargetType="{x:Type ToolTip}">
    <Style.Setters>
        <Setter Property="Visibility" Value="Collapsed" />
    </Style.Setters>
</Style>


我在构建过程中遇到一些错误:

BindingExpression路径错误:在“对象”“CalculationViewModel”上找不到“TooltipsEnabled”属性 BindingExpression路径错误:在“对象”“设置视图模型”上找不到“TooltipsEnabled”属性
BindingExpression路径错误:在“对象”“ControllerViewModel”“上找不到“TooltipsEnabled”属性。

错误非常清楚地指出,您需要在所有ViewModels中定义属性“TooltipsEnabled”。当您在其中一个视图中包含字典“MyStyle”时,WPF会尝试在当前DataContext上绑定该属性,该属性很可能是包含样式的视图的相应ViewModel

就我个人而言,我至少会定义一个像“IBaseViewModel”这样的接口来定义这个属性,所以所有的ViewModels都需要实现这个属性。为这种情况创建一个基类(在ViewModels中从中派生)也是一个选项

您的基类可以如下所示:

public class BaseViewModel : IBaseViewModel, INotifyPropertyChanged
{
    private bool tooltipsEnabled;

    public bool TooltipsEnabled
    {
        get { return tooltipsEnabled; }
        set
        {
            tooltipsEnabled = value;
            NotifyPropertyChanged("TooltipsEnabled");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

正如错误明确指出的,您需要在所有ViewModels中定义属性“TooltipsEnabled”。当您在其中一个视图中包含字典“MyStyle”时,WPF会尝试在当前DataContext上绑定该属性,该属性很可能是包含样式的视图的相应ViewModel

就我个人而言,我至少会定义一个像“IBaseViewModel”这样的接口来定义这个属性,所以所有的ViewModels都需要实现这个属性。为这种情况创建一个基类(在ViewModels中从中派生)也是一个选项

您的基类可以如下所示:

public class BaseViewModel : IBaseViewModel, INotifyPropertyChanged
{
    private bool tooltipsEnabled;

    public bool TooltipsEnabled
    {
        get { return tooltipsEnabled; }
        set
        {
            tooltipsEnabled = value;
            NotifyPropertyChanged("TooltipsEnabled");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

请向我们显示“BooleanVisibilityConverter”的代码。如果您打算使用标准转换器,它被称为“BooleanToVisibilityConverter”,定义在System.Windows.Controls.Torry copy&paste fault中。我的转换器的名称是BooleantVisibilityConverter。我在好几个地方使用它,效果很好。我不认为转换器是问题,只是看到你的编辑包括错误。您需要在所有ViewModels上声明属性。可能通过定义一个由所有viewmodels共享的基本界面。这个错误信息对我来说似乎很清楚。我不认为您可以在样式的代码隐藏中定义它。在哪里,尤其是之后如何设置属性?请向我们展示“BooleanVisibilityConverter”的代码。如果您打算使用标准转换器,它被称为“BooleanToVisibilityConverter”,定义在System.Windows.Controls.Torry copy&paste fault中。我的转换器的名称是BooleantVisibilityConverter。我在好几个地方使用它,效果很好。我不认为转换器是问题,只是看到你的编辑包括错误。您需要在所有ViewModels上声明属性。可能通过定义一个由所有viewmodels共享的基本界面。这个错误信息对我来说似乎很清楚。我不认为您可以在样式的代码隐藏中定义它。在哪里,尤其是之后如何设置属性?
public class BaseViewModel : IBaseViewModel, INotifyPropertyChanged
{
    private bool tooltipsEnabled;

    public bool TooltipsEnabled
    {
        get { return tooltipsEnabled; }
        set
        {
            tooltipsEnabled = value;
            NotifyPropertyChanged("TooltipsEnabled");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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