由于我们无法在不查看您的代码的情况下提供准确的解决方案。
这是一个检查列表,您可以按照以下步骤找出错误:
1.调试您的转换器并检查它是否为所有测试用例返回所需的值。
2.检查所有名称是否正确,您的 xaml 中是否有任何拼写错误。
这是一个将列 span 与 vm 绑定并使用绑定到 click 事件的命令对其进行更新的实现。
<Page.Resources>
<local:BoolToColumnSpanConverter x:Key="BoolToColumnSpanConverter" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.DataContext>
<local:Items />
</Grid.DataContext>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Rectangle HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Fill="Red"
Grid.ColumnSpan="{Binding span, Converter={StaticResource BoolToColumnSpanConverter}}" />
<Button Click="Button_Click"
Content="change span"
Grid.ColumnSpan="2"
Grid.Column="2"
Margin="5"
Command="{Binding ChangeSpanCommand, Mode=OneWay}" />
</Grid>
后面的代码:
转换器只是将 true 转换为 2,将 false 转换为 1
该命令绑定到 VM 中名为 UpdateSpan 的方法,该方法只是将布尔值反转。
当按钮被按下时,因为它绑定到命令被调用的命令,因为它只是返回一个带有 UpdateSpan 作为参数的新中继命令,这个方法被执行..这将更新触发更改的 span 布尔值,系统通过 OnPropertyChanged 事件通知该更改,并执行值转换器,将列跨度变为 1 和 2。
public class BoolToColumnSpanConverter : IValueConverter
{
public object Convert( object value , Type targetType , object parameter , string language )
{
var b = (bool)value;
return b ? 2 : 1;
}
public object ConvertBack( object value , Type targetType , object parameter , string language )
{
throw new NotImplementedException();
}
}
public class Items : INotifyPropertyChanged
{
private bool _span;
public bool span
{
get { return _span; }
set
{
if (value != _span) _span = value;
OnPropertyChanged();
}
}
public ICommand ChangeSpanCommand {
get
{
return new RelayCommand(() => UpdateSpan());
}
}
public Items()
{
span = true;
}
public void UpdateSpan()
{
span = !span;
}
#region Notify Property Changed Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged( [CallerMemberName]string propertyName = null )
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this , new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
public class RelayCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute( object parameter )
{
return true;
}
public void Execute( object parameter )
{
this._action();
}
private Action _action;
public RelayCommand( Action action )
{
this._action = action;
}
}