WPF XAML ListBox绑定到数组

时间:2015-06-29 09:33:39

标签: arrays wpf xaml data-binding listbox

所以我有一个浮点数组,我想在ListBox中作为ItemSource 在ItemTemplate中我有一个进度条,它应该将其Progress值绑定到给定的float值。但我无法看到这些值实际上与Progress属性绑定。

xaml代码(我不知道我是否错了,但我预计会有从float到double的隐式转换):

<ListBox ItemsSource="{Binding CoreLoads, Mode=OneWay}" BorderThickness="0">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type sys:Double}">
            <StackPanel>
                <ctrl:MetroProgressBar Orientation="Vertical" Progress="{Binding}" ExtenedBorderWidth="0.2" Width="30" Height="50" VerticalAlignment="Center"
                                       HorizontalAlignment="Center" BorderBrush="Black" BorderThickness="2" Background="White" Margin="5"/>
                <TextBlock Margin="0,3,0,3" HorizontalAlignment="Center" Text="{Binding LastUpdateTime, StringFormat='{}{0:hh:mm:ss tt}', Mode=OneWay}"
                           DataContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

xmlns:sys="clr-namespace:System;assembly=mscorlib"

和财产本身:

public double[] CoreLoads
{
    get { return cpuManagement.ProcessorInfo.LoadPercentages; }
}

注意:我使用的进度条是自定义控件,并且继承自System.Windows.Controls.Control

问题似乎是数组的值是正常的但是当绑定到TextBlock时值为0,因此进度条的进度始终为0.所以,我有一个正确的数据模板对于双阵列?或者我应该换成另一种类型的收藏品?

2 个答案:

答案 0 :(得分:0)

我想你应该在ViewModel中创建一个属性(假设你正在使用MVVM模式),它将代表ListBox的选定值:

    private double selectedCoreLoad;
    public Double SelectedCoreLoad
    {
        get
        {
            return selectedCoreLoad;
        }
        set
        {
            if (selectedCoreLoad != value)
            {
                selectedCoreLoad = value;
                RaisePropertyChanged("SelectedCoreLoad");
            }
        }
    }

然后,您应该将ListBox的选定值绑定到此属性:

<ListBox ItemsSource="{Binding CoreLoads, Mode=OneWay}" SelectedValue="{Binding SelectedCoreLoad, Mode=TwoWay}" BorderThickness="0">

<ctrl:MetroProgressBar Orientation="Vertical" Progress="{Binding SelectedCoreLoad}" ExtenedBorderWidth="0.2" Width="30" Height="50" VerticalAlignment="Center"
                                       HorizontalAlignment="Center" BorderBrush="Black" BorderThickness="2" Background="White" Margin="5"/>

<强> UPD

改为使用ObservableCollection:

private ObservableCollection<Double> coreLoads;
public ObservableCollection<Double> CoreLoads
{
    get { return coreLoads; }
    set
    {
        coreLoads = value;
        RaisePropertyChanged("CoreLoads");
    }
}

答案 1 :(得分:0)

所以找到答案:ListBox似乎不喜欢数组ItemsSource。将源更改为双列表后,一切正常。

public List<double> CoreLoads
{
    get { return new List<double>(cpuManagement.ProcessorInfo.LoadPercentages); }
}