XML绑定的组合框切换错误。

安倍

成员
已加入
2017年3月16日
留言内容
20
编程经验
Beginner
我有一个组合框,正在尝试做一个简单的switch语句。我不断收到错误消息。

C#:
System.InvalidCastException: 'Unable to cast object of type 'System.Xml.XmlElement' to type 'System.Windows.Controls.ComboBoxItem'.'

如果我也切换组合的内容
C#:
</ComboboxItem Content = "">
它工作正常。但是我不想手动输入1000个项目。我真的很想使用XML。我尝试了很多不同的选项,但出现错误或所选的项目值为"armor"每次。有任何想法吗?

我很确定问题是
C#:
ComboBoxItem selectedItem = (ComboBoxItem)armorselect.SelectedItem;
但是我不知道如何编写它以读取XML。

组合框XAML
C#:
     <ComboBox x:Name="armorselect" HorizontalAlignment="Left" VerticalAlignment="Top" Width="142" FontFamily="/Player Workbench;component/Fonts/#UnZialish" Background="#FF212121" Foreground="Black" DisplayMemberPath="Type" Margin="118,400,0,0" SelectionChanged="armorselect_SelectionChanged">
                                    <ComboBox.Resources>
                                        <SolidColorBrush x:Key="{x:Static SystemColors.WindowBrushKey}" Color="#FFADA5A5" />
                                        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF212121" />
                                    </ComboBox.Resources>
                                    <ComboBox.ItemsSource>
                                        <Binding Mode="OneTime" Source="{StaticResource Armor}" XPath="Armor"/>
                                    </ComboBox.ItemsSource>
                                </ComboBox>

转变
C#:
 private void armorselect_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            armorimage.Visibility = Visibility.Visible;
            int ac = (Convert.ToInt32(tac.Text));
            ComboBoxItem selectedItem = (ComboBoxItem)armorselect.SelectedItem;
            switch (selectedItem.Content.ToString())


            {
                case "Padded":
                    armorimage.Source = new BitmapImage(new Uri("/Images/i_padded.png", UriKind.Relative));
                    ac = 11;
                    break;


                case "Leather":
                    armorimage.Source = new BitmapImage(new Uri("/Images/i_leather.png", UriKind.Relative));
                    ac = 11;
                    break;


                case "Studded Leather":
                    armorimage.Source = new BitmapImage(new Uri("/Images/i_studded_leather.png", UriKind.Relative));
                    ac = 12;
                    break;


                case "Hide":
                    armorimage.Source = new BitmapImage(new Uri("/Images/i_hide.png", UriKind.Relative));
                    ac = 12;
                    break;

XML样本
C#:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ArmorInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Armor>
        <Type>Padded</Type>
        <Cost>5gp</Cost>
        <AC>11 + Dex modifier</AC>
        <Strength>N/A</Strength>
        <Stealth>Disadvantage</Stealth>
        <Weight>8lbs</Weight>
    </Armor>
    <Armor>
        <Type>Leather </Type>
        <Cost>10gp</Cost>
        <AC>11 + Dex modifier</AC>
        <Strength>N/A</Strength>
        <Stealth>N/A</Stealth>
        <Weight>10lbs</Weight>
    </Armor>
    <Armor>
        <Type>Studded Leather</Type>
        <Cost>45gp</Cost>
        <AC>12 + Dex modifier</AC>
        <Strength>N/A</Strength>
        <Stealth>N/A</Stealth>
        <Weight>13lbs</Weight>
    </Armor>
    <Armor>
        <Type>Hide</Type>
        <Cost>10gp</Cost>
        <AC>12 + Dex modifier (Max 2)</AC>
        <Strength>N/A</Strength>
        <Stealth>N/A</Stealth>
        <Weight>12lbs</Weight>
    </Armor>
    <Armor>
 

安倍

成员
已加入
2017年3月16日
留言内容
20
编程经验
Beginner
我认为您想使用SelectedValue属性而不是SelectedItem

谢谢回复。也更改了Slecteditem SelectedValue。也将名称更改为选择,以减少混乱。仍然出现错误。

C#:
    ComboBoxItem choice = (ComboBoxItem)armorselect.SelectedValue;
    switch (choice.Content.ToString())

System.InvalidCastException:'无法将类型为'System.String'的对象强制转换为类型为'System.Windows.Controls.ComboBoxItem'。”

(selectedIndex也不起作用。)
 

安倍

成员
已加入
2017年3月16日
留言内容
20
编程经验
Beginner
进步!

所以我按照你的建议做了

C#:
switch [COLOR=#333333](armorselect.SelectedValue) [/COLOR]


没有更多的错误,并且在组合框中填充了正确的项目,但所有情况均不起作用。我做了一个断点,.SelectedValue正在获取整个XML。"Padded" "14gp"等等等等。只需要它来获得价值"Padded",该组合框正在显示。

 

土佐

成员
已加入
2017年7月9日
留言内容
19
编程经验
5-10
我在ASP.net上工作不多,但是,您的组合框已绑定到"Armor"节点,这就是为什么您获得多余的XML的原因。

C#:
<Binding Mode="OneTime" Source="{StaticResource Armor}" XPath="Armor"/>

您的XPath需要直接绑定到"Type"如果您正在寻找"Padding"价值。可能是这样的:

C#:
<Binding Mode="OneTime" Source="{StaticResource Armor}" XPath="Armor\Type"/>
 

安倍

成员
已加入
2017年3月16日
留言内容
20
编程经验
Beginner
讨厌再次打扰你。在修复我的case语句的同时,从SelectedItem更改为SelectedValue,这破坏了我绑定到该文本框的所有文本框。它们现在都显示为Null。这是他们的约束力。有任何想法吗?我尝试了SelectedItem和SelectedValue都为null。

C#:
DataContext="{Binding SelectedItem, ElementName=armorselect}" Text="{Binding [AC].InnerText}"
DataContext="{Binding SelectedValue, ElementName=armorselect}" Text="{Binding [AC].InnerText}"
 

土佐

成员
已加入
2017年7月9日
留言内容
19
编程经验
5-10
在看不到您所有代码的情况下,我只能为您提供一些指针。现在,您的组合框仅绑定到单个xml元素,因此,如果将文本框绑定到组合框,则除"Type"属性将为null。我确信只要使用单个数据源,就可以动态地检索文本框所需的值。大概是(只是伪代码):

C#:
//Armor/[@Type=combobox.SeletedValue]/Cost

换句话说,您需要获取组合框的值并在xpath中为文本框动态使用它。抱歉,我无法提供特定的代码,就像我说的那样,我很少使用asp.net
 
最佳 底部