【发布时间】:2014-03-26 04:58:24
【问题描述】:
我有一个 MenuItem,只有在 ListBox 中选择了某些内容时才应该启用它。我写了一个从对象到布尔的转换器,如果该对象== null,则返回false,否则返回true。我用我的转换器将它绑定到 ListBox.SelectedItem,但它不起作用。在转换器中放置一个断点表明它永远不会运行。无论如何,MenuItem 始终处于启用状态。
这是 ListBox 和 MenuItem 的 xaml 代码
<ListBox Name="TestsListBox"
HorizontalAlignment="Left" Height="93" VerticalAlignment="Top" Width="128"
Margin="0,5,-1.723,0" ItemsSource="{Binding Path=Tests, Mode=OneWay}">
<ListBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Remove" Click="removeTest"
IsEnabled="{Binding ElementName=TestsListBox, Mode=OneWay,
Path=SelectedItem, Converter={StaticResource ObjectToBool}}"/>
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>
这里我展示了转换器是如何声明为窗口资源的
<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:ClassesLib="clr-namespace:Laba1;assembly=ClassesLib"
xmlns:local="clr-namespace:WpfApplication"
Title="MainWindow" Height="450" Width="525">
<Window.Resources>
<local:ObjectToBoolConverter x:Key="ObjectToBool"/>
</Window.Resources>
这里是转换器类
namespace WpfApplication
{
class ObjectToBoolConverter: IValueConverter
{
// Converts value to boolean. If value is null, returns false.
// Otherwise returns true
public object Convert(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
if (null == value)
{
return false;
}
return true;
}
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException("This is oneway converter, so ConvertBack is not supported");
}
}
}
【问题讨论】:
-
你的数据上下文设置了吗?您是否也尝试过将菜单项绑定到命令并实现 canExecute 方法?
-
我的 DataContext 在 Window 的构造函数中设置为整个窗口到我的 ViewModel,ListBox 从中获取它的项目,但它与是否启用该项目无关。你说的我没试过,第一次听说这种方法。我不确定 'Click="removeTest"' 与将其绑定到命令有何不同。
-
当使用 mvvm 模式时,最佳实践是将域(业务逻辑)与代码隐藏文件隔离开来。后面的代码应该尽可能少的逻辑,以增加复用的灵活性。这些命令有多种好处,例如可以更轻松地实现撤消模式。命令的另一个好处是它使您能够预先检查将自动启用和禁用按钮的条件。这有助于将条件逻辑与业务逻辑分开(换句话说,我只能在满足所有条件时执行该方法)
-
我认为启用/禁用菜单项与业务逻辑无关。
-
如果你有“oneWay”,当它更新源时它不会更新视图。
标签: c# wpf xaml listbox ivalueconverter