C# CodeBehind不为ResourceDictionary工作
我想通过属性禁用WPF c#应用程序中的所有工具提示。我对我的所有窗口、用户控件等使用ResourceDictionary(MyStyle.xaml):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> 但绑
<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));
}
}
}