gpt4 book ai didi

c# - 在使用 ItemsSource 和帮助使用 Combo Box 之前,WPF Items 集合必须为空

转载 作者:太空狗 更新时间:2023-10-30 00:02:52 33 4
gpt4 key购买 nike

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>



<Grid Grid.Column="0" Background="DarkCyan">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ComboBox ItemsSource="{Binding Path=charList}" x:Name="comboBox" VerticalAlignment="Top" Width="Auto" Grid.ColumnSpan="2">
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Image Source="Pictures\bagi_warrior.jpg" Width="100" Height="150"/>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="6*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="{Binding Path=Character.Name}" FontSize="30"/>
<Label Grid.Row="1" Content="{Binding Path=Character.Level}" FontSize="20"/>
</Grid>
</StackPanel>
</ComboBoxItem>
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Image Source="Pictures\azure_knight.jpg" Width="100" Height="130"/>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="6*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="Azure Knight" FontSize="30"/>
<Label Grid.Row="1" Content="Level 158" FontSize="20"/>
</Grid>
</StackPanel>
</ComboBoxItem>
</ComboBox>
<Label x:Name="strLabel" Grid.Column="0" VerticalAlignment="Bottom" Height="30" Content="Str: " HorizontalContentAlignment="Center" FontSize="16"/>
<Label x:Name="intLabel" Grid.Column="1" VerticalAlignment="Bottom" Height="30" Content="Int: " HorizontalContentAlignment="Center" FontSize="16"/>
<Label x:Name="dexLabel" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" Height="30" Content="Dex: " HorizontalContentAlignment="Center" FontSize="16"/>
<Label x:Name="goldLabel" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Height="30" Content="Gold: " HorizontalContentAlignment="Center" FontSize="16"/>


</Grid>
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<DataGrid x:Name="MyGrid" ItemsSource="{Binding Path=Item}"></DataGrid>
</Grid>
</Grid>

我的 XAML 是这样的,它看起来像这样:

http://puu.sh/aLLrx.png

http://puu.sh/aLLsQ.jpg

我的代码是:

 public partial class MainWindow : Window
{

Character aloken;
Character azureKnight;
Character bagiWarrior;
Character incarMagician;
Character segitaHunter;
Character segnale;
Character viciousSummoner;
private List<Character> _charList = new List<Character>();

public MainWindow()
{
InitializeComponent();
charList.Add(new Character("Bagi Warrior"));
this.Item = new ObservableCollection<Item>();
this.Character = new ObservableCollection<Character>();

this.DataContext = this;
//Character.Add(new Character(name: "Bagi Warrior", level: 197, characterClass: CharacterClass.Bagi_Warrior, gender: Gender.Male, strength: 450, intelligence: 4, dexterity: 84, gold: 147203352));
//Character.Add(new Character(name: "Azure Knight", level: 158, characterClass: CharacterClass.Azure_Knight, gender: Gender.Male, strength: 390, intelligence: 120, dexterity: 92, gold: 204220567));
//Character.Add(new Character(name: "Incar Magician", level: 169, characterClass: CharacterClass.Incar_Magician, gender: Gender.Female, strength: 4, intelligence: 512, dexterity: 57, gold: 172223520));
//Character.Add(new Character(name: "Vicious Summoner", level: 203, characterClass: CharacterClass.Vicious_Summoner, gender: Gender.Male, strength: 423, intelligence: 89, dexterity: 45, gold: 114225587));

}

public List<Character> charList
{
get { return _charList; }
set { _charList = value; }
}


private ObservableCollection<Character> _Character;

public ObservableCollection<Character> Character
{
get { return _Character; }
set { _Character = value; }
}


private ObservableCollection<Item> _Item;
public ObservableCollection<Item> Item
{
get { return _Item; }
set { _Item = value; }
}

}

字符类(以防万一): http://pastebin.com/GFycKqDC

元素等级(以防万一): http://pastebin.com/RgXzbFHk

这是一个 RPG 项目,您必须对组合框使用数据绑定(bind)并为组合框创建 ObservableCollection 并查看每个角色。

我遇到的问题是:在我的组合框中,我希望能够显示带有“图像”的角色以及旁边的“级别”和“名称”

但我不希望它是静态的,我想创建一个角色列表并将 ItemsSource 绑定(bind)到我的组合框,这样无论我选择哪个角色,基于该角色的信息都会更新。我该怎么做?

有人告诉我,创建一个字符列表,然后为 ComboBox Item 创建一个数据模板,其中包含绑定(bind)到 selectedItem 的图片、名称和级别就可以完成这项工作(我将其称为 charList),但我是否这样做在代码或 XAML 中,它抛出一个异常,指出在我绑定(bind)到它之前集合必须为空。

我想将数据模板中的属性绑定(bind)到 selectedItem,以便标签和信息适当更新。

我哪里做错了,为什么会抛出这个异常?

编辑

好的,现在问题已经解决了!但是,为什么我的 Label 绑定(bind)仍然不适用于 Character.Name 和 Character.Level?

http://puu.sh/aLPr7.jpg

编辑 2 公共(public)主窗口() { 初始化组件(); Character.Add(new Character("Bagi Warrior")); Character.Add(new Character("碧蓝骑士")); this.Item = new ObservableCollection(); this.Character = new ObservableCollection();

        this.DataContext = this;
//Character.Add(new Character(name: "Bagi Warrior", level: 197, characterClass: CharacterClass.Bagi_Warrior, gender: Gender.Male, strength: 450, intelligence: 4, dexterity: 84, gold: 147203352));
//Character.Add(new Character(name: "Azure Knight", level: 158, characterClass: CharacterClass.Azure_Knight, gender: Gender.Male, strength: 390, intelligence: 120, dexterity: 92, gold: 204220567));
//Character.Add(new Character(name: "Incar Magician", level: 169, characterClass: CharacterClass.Incar_Magician, gender: Gender.Female, strength: 4, intelligence: 512, dexterity: 57, gold: 172223520));
//Character.Add(new Character(name: "Vicious Summoner", level: 203, characterClass: CharacterClass.Vicious_Summoner, gender: Gender.Male, strength: 423, intelligence: 89, dexterity: 45, gold: 114225587));

}

//public List<Character> charList
//{
// get { return _charList; }
// set { _charList = value; }
//}


private ObservableCollection<Character> _Character;

public ObservableCollection<Character> Character
{
get { return _Character; }
set { _Character = value; }
}

然后是 XAML:

<Grid Grid.Column="0" Background="DarkCyan">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<ComboBox ItemsSource="{Binding Path=Character}" x:Name="comboBox" VerticalAlignment="Top" Width="Auto" Grid.ColumnSpan="2">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image x:Name="image" Source="{Binding Source={StaticResource ImageConverter}}" Width="100" Height="150"/>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="6*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="{Binding Path=Character.Name}" FontSize="30"/>
<Label Grid.Row="1" Content="{Binding Path=Character.Level}" FontSize="20"/>
</Grid>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>

最佳答案

您定义了 ItemsSource 两次。

一次使用

ItemsSource="{Binding charList}"

然后再用

<ComboBoxItem>

您需要将 ComboBoxItem 元素替换为 ComboBox.ItemTemplate 并为您的 ComboxItem 创建一个 DataTemplate .然后您需要将 Image Source 绑定(bind)到 Character 类的属性或使用 ItemTemplateSelector让它为项目使用适当的 DataTemplate。如果只有图像源位置发生变化,您还可以使用绑定(bind)到定义字符类的属性的数据触发器。

关于c# - 在使用 ItemsSource 和帮助使用 Combo Box 之前,WPF Items 集合必须为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25223978/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com