用WPF/C绑定数据#

Binding data with WPF/C#

我的数据绑定有问题(绑定更新?)。启动应用程序后,我加载图像并希望以 0-255 的比例显示它们的直方图。变量 'frequency' 已经准备好数据。我想将它们绑定到 xaml 以显示某种图表。 XAML 代码可以很好地处理一些静态数据,但是将值赋给 'frequency' 它不会显示任何内容。

XAML:

        <ItemsControl Name="ItemsControlName" ItemsSource="{Binding ChartValues}">
            <ItemsControl.DataContext>
                <local:DicomChart/>
            </ItemsControl.DataContext>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Rectangle Height="{Binding }" Width="4" VerticalAlignment="Bottom"
                   Fill="#eee" Stroke="Gray" Margin="-1.0"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

C#:

    private void RegionGrowing(object sender, RoutedEventArgs e)
    {
        int[] frequency = new int[256];

        for (int m = 0; m < 512; m++)
        {
            for (int n = 0; n < 512; n++)
            {
                frequency[database[pictureIndex, m, n]] += 1;
            }
        }

        DicomChart dc = new DicomChart();
        dc.ChartValues = frequency.ToArray();
    }

DicomClass class:

public class DicomChart
{

    public DicomChart()
    {


    }

    public int[] ChartValues { get; set; }
    
}

尝试使用额外的 class,例如 DicomChartItem 并用它填充可观察集合,类似的东西

C#:

public class DicomChart   
{
    public ObservableCollection<DicomChartItem> ChartItems{ get; set; } = new ObservableCollection<DicomChartItem>();
}
public class DicomChartItem
{
 public int _Value { get; set; }

    public DicomChartItem(int Value)
    {
        _Value = Value;
    }
}

XAML:

<ItemsControl ItemsSource="{Binding ChartItems}">
        <ItemsControl.DataContext>
            <local:DicomChart/>
        </ItemsControl.DataContext>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type local:DicomChartItem}">
                <Rectangle Height="{Binding _Value}" Width="4" VerticalAlignment="Bottom"
                   Fill="#eee" Stroke="Gray" Margin="-1.0"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

必须在调用 CollectionChanged 事件的循环中填充 Observable 集合,在另一种情况下,您需要使用 INotifyPropertyChanged 接口中的 PropertyChanged 事件。

C#:

private void RegionGrowing(object sender, RoutedEventArgs e)
    {
        int[] frequency = new int[256];

        for (int m = 0; m < 512; m++)
        {
            for (int n = 0; n < 512; n++)
            {
                frequency[database[pictureIndex, m, n]] += 1;
            }
        }

        DicomChart dc = new DicomChart();

        foreach (var item in frequency)
            dc.ChartItems.Add(new DicomChartItem(item));
    }
  1. 你必须像我说的那样用 ObservableCollection<int> 替换 int[] 。它不适用于简单数组,因为 UI 不会收到有关更改的通知。
  2. 将 x:Name="Items" 添加到您的 ItemsControl 以便能够从后面的代码访问它;
  3. 在您的 RegionGrowing 中添加此代码:var ds = (DicomChart) Items.DataContext;
  4. 向您的 ds 对象添加值,例如 ds.ChartValues.Add().