【问题标题】:UWP ICommand DependencyProperty cast errorUWP ICommand DependencyProperty 转换错误
【发布时间】:2016-10-11 19:17:13
【问题描述】:

我在绑定 ICommand 类型的 DependencyProperty 时遇到问题。 这是我的自定义用户控件:

<UserControl x:Class="HexEditor.Controls.NavButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="using:HexEditor.Controls"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             d:DesignHeight="300"
             d:DesignWidth="400"
             DataContext="{Binding RelativeSource={RelativeSource Self}}"
             mc:Ignorable="d">

    <ToggleButton x:Name="toggleWrap"
                  Width="140"
                  Height="48"
                  Background="Transparent"
                  BorderThickness="0"
                  Command="{Binding Command}"
                  CommandParameter="{Binding CommandParameter}"
                  IsChecked="{Binding IsChecked}">
        <Grid Width="140">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <FontIcon Margin="6,0,0,0"
                      Glyph="{Binding Icon}" />
            <TextBlock Grid.Column="1"
                       Margin="32,0,0,0"
                       Text="{Binding Title}" />
        </Grid>
    </ToggleButton>
</UserControl>

这是我控制的代码:

public sealed partial class NavButton : UserControl
    {
        public NavButton()
        {
            this.InitializeComponent();
        }

        public static readonly DependencyProperty IconProperty =
            DependencyProperty.Register("Icon", typeof(string), typeof(FontIcon), new PropertyMetadata(""));

        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(TextBlock), new PropertyMetadata(""));

        public static readonly DependencyProperty IsCheckedProperty =
            DependencyProperty.Register("IsChecked", typeof(bool), typeof(ToggleButton), new PropertyMetadata(""));

        public static readonly DependencyProperty CommandProperty =
            DependencyProperty.Register("Command", typeof(ICommand), typeof(ToggleButton), new PropertyMetadata(""));

        public static readonly DependencyProperty CommandParameterProperty =
            DependencyProperty.Register("CommandParameter", typeof(object), typeof(ToggleButton), new PropertyMetadata(""));

        public string Icon
        {
            get { return (string)GetValue(IconProperty); }
            set { SetValue(IconProperty, value); }
        }

        public string Title
        {
            get { return (string)GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }

        public bool IsChecked
        {
            get { return Convert.ToBoolean(GetValue(IsCheckedProperty)); }
            set { SetValue(IsCheckedProperty, value); }
        }

        public ICommand Command
        {
            get { return (ICommand)GetValue(CommandProperty); }
            set { SetValue(CommandProperty, value); }
        }

        public object CommandParameter
        {
            get { return GetValue(CommandParameterProperty); }
            set { SetValue(CommandParameterProperty, value); }
        }
    }

这是我使用控件的页面:

<UserControl x:Class="HexEditor.Common.RootFrame"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:Controls="using:HexEditor.Controls"
             xmlns:Interactions="using:Microsoft.Xaml.Interactions.Core"
             xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="using:HexEditor.Common"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             d:DesignHeight="300"
             d:DesignWidth="400"
             DataContext="{Binding CommonViewModel,
                                   Source={StaticResource Locator}}"
             mc:Ignorable="d">
    <Grid Background="White">
        <SplitView x:Name="navSplitView"
                   Width="Auto"
                   DisplayMode="CompactOverlay"
                   OpenPaneLength="140">
            <SplitView.Pane>
                <StackPanel>
                    <ToggleButton x:Name="hamBtn"
                                  Width="48"
                                  Height="48"
                                  BorderThickness="0">
                        <FontIcon Glyph="&#xE700;" />
                    </ToggleButton>
                    <Controls:NavButton Title="Home"
                                        Command="{Binding NavigationCommand}"
                                        CommandParameter="HomePage"
                                        Icon="&#59407;"
                                        IsChecked="True" />
                    <Controls:NavButton Title="Settings"
                                        Command="{Binding NavigationCommand}"
                                        CommandParameter="SettingsPage"
                                        Icon="&#59155;"
                                        IsChecked="False" />
                </StackPanel>
            </SplitView.Pane>
            <SplitView.Content>
                <Frame x:Name="NavFrame" />
            </SplitView.Content>
            <Interactivity:Interaction.Behaviors>
                <Interactions:DataTriggerBehavior Binding="{Binding IsChecked,
                                                                    ElementName=hamBtn}"
                                                  Value="True">
                    <Interactions:ChangePropertyAction PropertyName="IsPaneOpen"
                                                       TargetObject="{Binding ElementName=navSplitView}"
                                                       Value="True" />
                </Interactions:DataTriggerBehavior>
                <Interactions:DataTriggerBehavior Binding="{Binding IsChecked,
                                                                    ElementName=hamBtn}"
                                                  Value="False">
                    <Interactions:ChangePropertyAction PropertyName="IsPaneOpen"
                                                       TargetObject="{Binding ElementName=navSplitView}"
                                                       Value="False" />
                </Interactions:DataTriggerBehavior>
            </Interactivity:Interaction.Behaviors>
        </SplitView>
    </Grid>

</UserControl>

这是视图模型:

public class CommonViewModel : ViewModelBase
    {
        public CommonViewModel()
        {
            this.NavigationCommand = new RelayCommand<NavigationSource>(this.ExecuteNavigationCommand);
        }

        public ICommand NavigationCommand { get; private set; }

        private void ExecuteNavigationCommand(NavigationSource state)
        {
            NavigationProvider.Instance.NavigateTo(state);
        }
    }

编译时出现异常:

Exception thrown: 'System.InvalidCastException' in HexEditor.exe
'HexEditor.exe' (CoreCLR: CoreCLR_UWP_Domain): Loaded 'C:\Users\Root\documents\visual studio 2015\Projects\HexEditor\HexEditor\bin\x86\Debug\AppX\System.Resources.ResourceManager.dll'. Module was built without symbols.
Exception thrown: 'Windows.UI.Xaml.Markup.XamlParseException' in HexEditor.exe
WinRT information: Failed to assign to property 'HexEditor.Controls.NavButton.Command'. [Line: 29 Position: 41]
An exception of type 'Windows.UI.Xaml.Markup.XamlParseException' occurred in HexEditor.exe but was not handled in user code
WinRT information: Failed to assign to property 'HexEditor.Controls.NavButton.Command'. [Line: 29 Position: 41]
Additional information: The text associated with this error code could not be found.

Failed to assign to property 'HexEditor.Controls.NavButton.Command'. [Line: 29 Position: 41]

我做错了什么?

【问题讨论】:

  • The third parameter of DependencyProperty.Register 是所属类的类型。在您的情况下,这是typeof(NavButton),对于它的所有依赖属性。此外,boolICommand 类型的依赖属性的默认值 ""(在这两种情况下都是 new PropertyMetadata(""))。您不能将字符串转换为任何一个。 IsChecked 应默认为 falseCommand 应默认为 null
  • @ed,异常已经消失,谢谢。

标签: c# xaml uwp icommand


【解决方案1】:

我认为问题在于 boolICommand 类型的依赖属性的默认值是“”(在这两种情况下都是 new PropertyMetadata(""))。您不能将字符串强制转换为任何一个,这将导致抛出异常。 IsChecked 应默认为 falseCommand 应默认为 null

这可能与您要询问的确切问题相关,也可能不相关,但这也很重要:DependencyProperty.Register() 的第三个参数应该是所属类的类型。在您的情况下,这是typeof(NavButton),对于它的所有依赖项属性。

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 2016-03-18
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多