请参阅修改3 以获取更新摘要。
我正在开发一个WPF Prism应用程序,其视图具有Grid
元素,只有在三个命令中的任何一个返回true
时才能看到该元素。现在我已经通过为每个命令创建一个bool
属性来工作,它返回是否可以激活,但我不应该这样做,因为它复制了命令可以做的事情。
这是我现在拥有的XAML:
<Grid x:Name="OptionsContainer">
<Grid.Style>
<Style>
<Setter Property="Grid.Visibility" Value="Visible" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=CanSaveUser}" Value="false" />
<Condition Binding="{Binding Path=CanUndoAll}" Value="false" />
<Condition Binding="{Binding Path=CanDeleteUser}" Value="false" />
</MultiDataTrigger.Conditions>
<Setter Property="Grid.Visibility" Value="Collapsed" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<!-- Elements nested in this grid go here. -->
</Grid>
这是有效的,但我无法找到将其转换为使用命令的方法。过去两天我一直在寻找并没有遇到我正在寻找的东西,但如果有现有资源,请随时指出我的方向!
编辑:以下是我对Condition
的实现看起来像使用命令。对我来说,这是我最好的猜测。
<Condition Binding="{Binding Path=SaveUserCommand, Converter={StaticResource InvCmndToBool}, ConverterParameter=InvertFalse}" Value="false" />
编辑2 :我意识到最好在我编写的第一个编辑中包含我正在调用的转换器。你会在下面找到它。
[ValueConversion(typeof(DelegateCommand<object>), typeof(bool))]
public class InvertableCommandToBoolConverter : IValueConverter
{
enum Parameters
{
InvertFalse, InvertTrue
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DelegateCommand<object> command = (DelegateCommand<object>)value;
bool boolValue = command.CanExecute(null);
var direction = (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);
if (direction == Parameters.InvertTrue)
return !boolValue;
return boolValue;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return null;
}
}
编辑3 :经过一些更多的测试后,我将问题范围缩小到绑定,而不是更新(据我所知)调用相应命令的CanExecuteChanged
事件。绑定到在命令的CanExecute(object)
方法中更新的bool值会更新MultiDataTrigger,但使用命令则不会。这意味着它在最初创建视图时设置正确的值。不确定是否还需要做其他事情来确保命令被调用?
您可以看到我的第一次编辑,以了解我现在使用的条件示例。