如何在xaml中列表与列表框之间进行绑定?

时间:2015-12-24 21:11:23

标签: wpf list xaml binding listbox

我有一个ObservableCollection和一个ListBox,我想在它们之间进行绑定,但是在后面的代码中没有使用listBox1.DataSource/ItemsSource = ...,我发现了很多这样的例子,但我需要仅在xaml代码中进行绑定 如果我没弄错的话,我需要先把我的名单作为财产。

    private ObservableCollection<ProtectionBase> _listhelmets;
    public ObservableCollection<ProtectionBase> ListHelmets
    {
        get { return _listhelmets; }
        set { _listhelmets = value; }
    } 

    public MainWindow()
    {

        InitializeComponent();
        ListHelmets.Add(new Helmet(){protection=5});
        ListHelmets.Add(new Helmet() { protection = 7 });

        this.DataContext = _listhelmets;
    }

xaml代码:

<ListBox x:Name="listhelmets" Height="215" Width="197"       PreviewMouseDown="helmet_MouseDown1"
                     PreviewMouseLeftButtonDown="helmet_PreviewMouseLeftButtonDown"
                     PreviewMouseMove="helmet_PreviewMouseMove" ItemsSource="{Binding}">
                <TextBlock FontWeight="Bold" FontSize="13" Background="Silver" Margin="0 0 0 10" Text="Шлемы"> </TextBlock>
                <ListBoxItem >
                    <StackPanel Orientation="Horizontal"  DataContext="{Binding ElementName=listhelmets, Path=SelectedItem}"
                         MouseEnter="ChoosingHelmet1"
                         DragOver="helmet1_DragOver"                                
                         DragEnter="helmet_DragEnter" AllowDrop ="true"
                         DragLeave="helmet_DragLeave" MouseLeftButtonDown="helmet_MouseLeftButtonDown_1">
                       <TextBlock Text="{Binding protection, ElementName=ListHelmets[0]}" Width="124"/>
                    </StackPanel>
                </ListBoxItem>
                <ListBoxItem >
                    <StackPanel Orientation="Horizontal">
                         <Image Source="D:..."/>
                    </StackPanel>
                </ListBoxItem>
</ListBox>

3 个答案:

答案 0 :(得分:0)

如果你没有使用MVVM,请在你的代码中执行此操作:

ListHelmets.Add(new ProtectionBase(){protection = 5});
ListHelmets.Add(new ProtectionBase() { protection = 7 });
listhelmets.ItemsSource = ListHelmets;

文本块文本 protection 必须是 ProtectionBase

类中的属性

在xaml中这样做: 删除 ItemsSource =“{Binding}”
从stackpanel中删除Datacontext,
删除,ElementName = ListHelmets [0]

如果您使用的是MVVM,请告诉我

答案 1 :(得分:0)

最简单的方法是使用IObservableCollection

在Xaml。

<ComboBox  Text="Content File.." 
                       IsEditable="True" 
                       ItemsSource="{Binding MySweetCollection}" 
                       HorizontalAlignment="Right"  
                       />

On Code Behind你必须有一个名为&#34; MySweetCollection&#34;的IObservableCollection。

在您的代码中,您将绑定设置为空。

答案 2 :(得分:0)

这肯定有用:

xaml:

 <ListBox x:Name="listhelmets" Height="215" Width="197" ItemsSource="{Binding}">
            <TextBlock FontWeight="Bold" FontSize="13" Background="Silver" Margin="0 0 0 10" Text="Шлемы"></TextBlock>
            <ListBox.ItemTemplate>
                <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding protection}" Width="124"/>
                </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>          
</ListBox>

xaml.cs

listhelmets.Items.Clear();
            List<ProtectionBase> Helmets = new List<ProtectionBase>();
            Helmets.Add(new ProtectionBase(){ protection = 7});
            Helmets.Add(new ProtectionBase() { protection = 8 });
            Helmets.Add(new ProtectionBase() { protection = 9 });

            listhelmets.ItemsSource = Helmets;

(我已经从xaml删除了所有事件和不必要的东西。请添加所有必要的事件)

我不明白是否需要这个文本块:

<TextBlock FontWeight="Bold" FontSize="13" Background="Silver" Margin="0 0 0 10" Text="Шлемы"></TextBlock>

我认为你应该将它放在列表框上方。你不应该把它放在ListBox