【发布时间】:2016-07-14 23:57:52
【问题描述】:
这不正常:
<MenuItem x:Uid="MenuItem_12" Header="400%" IsCheckable="True"
IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor, Converter={StaticResource IsValidZoomFactor}, ConverterParameter='400'}"/>
在我的Settings 中有一个整数ZoomFactor。设置设置为 Public 和范围 User。
在我的 XAML 顶部,我有一个命名空间:
xmlns:Properties="clr-namespace:OCLMEditor.Properties"
这是我的ValueConverter:
using System;
using System.Globalization;
using System.Windows.Data;
namespace OCLMEditor.ValueConverters
{
[ValueConversion(typeof(int), typeof(bool))]
public class IsCurrentZoomFactor : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int desiredZoomFactor = (int)value;
int currentZoomFactor = (int)parameter;
return desiredZoomFactor == currentZoomFactor;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
但我得到一个错误:
1>D:\My Programs\OCLMEditor\OCLMEditor\MainWindow.xaml(143,35):错误 MC3044:在 MarkupExtension 表达式的结束“}”之后不允许使用文本“}”。第 143 行位置 35。
我还有其他几个菜单项:
<MenuItem x:Uid="MenuItem_13" Header="300%" IsCheckable="True"/>
<MenuItem x:Uid="MenuItem_14" Header="250%" IsCheckable="True"/>
<MenuItem x:Uid="MenuItem_15" Header="200%" IsCheckable="True"/>
<MenuItem x:Uid="MenuItem_16" Header="175%" IsCheckable="True"/>
<MenuItem x:Uid="MenuItem_17" Header="150%" IsCheckable="True"/>
<MenuItem x:Uid="MenuItem_18" Header="125%" IsCheckable="True"/>
我不确定我的做法是否正确,但我的想法是:
- 将 Settings.ZoomFactor 值传递给转换器。
- 将预期的缩放系数值传递给转换器。
- 比较它们,如果它们相同,则将其设置为选中。
此外,目前它已“更改”,因此另一个缩放系数,设置要更新。我认为绑定到“设置”是正确的方法。但是有错误。
我确认错误出现在IsChecked 行:
更新错误:
这个位本身没有视觉错误:
<MenuItem x:Uid="MenuItem_12" Header="400%" IsCheckable="True"
IsChecked="{Binding Source={x:Static Properties:Settings.Default}, Path=ZoomFactor}"/>
所以出错的是转换器/值的引入。
现在,我不得不更换我的转换器:
using System;
using System.Globalization;
using System.Windows.Data;
namespace OCLMEditor.ValueConverters
{
[ValueConversion(typeof(int), typeof(bool))]
public class IsCurrentZoomFactor : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int currentZoomFactor = (int)value;
string strDesiredZoomFactor = (string)parameter;
int desiredZoomFactor = int.Parse(strDesiredZoomFactor);
return desiredZoomFactor == currentZoomFactor;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
因为我们传递 '400' 它是一个字符串。所以我必须将它转换为整数。如果我删除 ' ',它将不接受将其作为整数传递。
【问题讨论】:
-
您确定 MenuItem 是第 143 行/第 35 位的内容吗?该错误表示绑定中的孤立的右花括号或其他:例如
Foo="{Binding Bar}}" -
@EdPlunkett 大括号似乎是正确的。
-
它们看起来是正确的。这不是单引号,它们在你有它们的地方很好。那条线上没有其他东西,对吧?您是否清理了解决方案,重新启动 VS 并构建?当 XAML 编辑器似乎失去理智时,这总是值得尝试的。
-
我认为那里没有任何“反向转换”。您有一个命令或设置缩放因子的东西,当缩放因子发生变化时,菜单项会自行检查或取消选中。没有任何事情朝着另一个方向发展。您可以执行一个命令,或者只是一个它们都共享的单击事件,将每个 MenuItem 的
Tag属性设置为适当的缩放系数;在点击处理程序中,Settings.Default.ZoomFactor = Int32.Parse((String) ((MenuItem)sender).Tag);不是纯粹的 MVVM,但你不必总是对这些东西狂热。 -
在下面我的答案末尾添加了一个更新——它不是缩放因子转换器,它确实是一个普遍有用的整数相等检查转换器。