我有这个简单的WPF
页面,我在其中添加了一个本地资源,它的定义在Page的后端文件中。
<Page x:Class="WindowsSampleApplication.ValueConverter"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WindowsSampleApplication"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Title="ValueConverter">
<Page.Resources>
<local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />
</Page.Resources>
<Grid>
<StackPanel Margin="10">
<TextBox Name="txtValue" />
<WrapPanel Margin="0,10">
<TextBlock Text="Current value is: " />
<TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock>
</WrapPanel>
<CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" />
</StackPanel>
</Grid>
</Page>
这是Page
namespace WindowsSampleApplication
{
public partial class ValueConverter : Page
{
public ValueConverter()
{
InitializeComponent();
}
public class YesNoToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch (value.ToString().ToLower())
{
case "yes":
return true;
case "no":
return false;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is bool)
{
if ((bool)value == true)
return "yes";
else
return "no";
}
return "no";
}
}
}
}
我在WindowsSampleApplication
级别中正确包含了名称空间Page
,并且相同的名称空间具有我的资源的定义。但是在添加error
local resource
我刚刚开始使用 here 中的WPF
教程,但我只是尝试而不是按照教程进行了添加页面而不是 Window ,因为我已经在那里创建了Window
早期演示,并希望我已经转换了 Page 需要的所有内容而不是窗口即可。有人知道如何解决这个问题吗?
更新
我还尝试用<local..../>
封装<ResourceDictionary>
,因为我在SO中准备好它,但没有多大用处,错误仍然存在。
答案 0 :(得分:3)
因为看起来你只是在试用WPF,并且你没有特殊原因将转换器放在代码隐藏中,我会建议创建转换器的常用方法:
在WindowsSampleApplication项目中创建新目录 Converters 。然后为每个转换器添加一个新的类文件......
现在您知道在哪里可以找到转换器,并且可以轻松地重复使用它们。
PS:可以将转换器作为嵌套类放在代码隐藏中,但是你应该有充分的理由去做。 (Binding converter as inner class?)
答案 1 :(得分:1)
我认为您的问题是您已将转换器嵌套在ValueConverter
页面内。
[编辑]
不可能实例化嵌套类,因此唯一的选择是直接在WindowsSampleApplication
命名空间中声明转换器类。
更新了代码
namespace WindowsSampleApplication
{
public partial class ValueConverter : Page
{
public ValueConverter()
{
InitializeComponent();
}
//Removed from here
}
public class YesNoToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch (value.ToString().ToLower())
{
case "yes":
case "oui":
return true;
case "no":
case "non":
return false;
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is bool)
{
if ((bool)value == true)
return "yes";
else
return "no";
}
return "no";
}
}
}
答案 2 :(得分:1)
您需要直接在命名空间中声明YesNoToBooleanConverter
。
从MSDN:WPF的XAML和自定义类
您的自定义类必须是公共的,并且支持默认(无参数)公共构造函数。 (有关结构的说明,请参阅以下部分。) 您的自定义类不能是嵌套类。嵌套类和一般CLR使用语法中的“点”会干扰其他WPF和/或XAML功能,例如附加属性。
链接:
https://msdn.microsoft.com/en-us/library/ms753379(v=vs.100).aspx