【发布时间】:2021-05-24 09:58:08
【问题描述】:
我遇到了数据绑定问题(绑定更新?)。启动应用程序后,我加载图像并希望以 0-255 的比例显示它们的直方图。变量“频率”已经准备好数据。我想将它们绑定到 xaml 以显示某种图表。 XAML 代码可以很好地处理一些静态数据,但是将值分配给“频率”它不会显示任何内容。
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 类:
public class DicomChart
{
public DicomChart()
{
}
public int[] ChartValues { get; set; }
}
【问题讨论】:
-
您必须使用引发事件
CollectionChanged的 ObservableCollection才能在 WPF 中更新 UI。当您的 UI 被渲染并且数组绑定到 ItemsControl 时,它不知道它已更改。这就是需要 ObservableCollection 的地方。 -
你的绑定应该像这样 ItemsSource="{Binding ChartValues, UpdateSourceTrigger=PropertyChanged}"
-
@DmitriyPolyanskiy 你的意思是把“public int[] ChartValues {get; set;}”改成“public ObservableCollection
ChartValues {get; set;}”吗? -
@tm607 是的!没错!
-
@DmitriyPolyanskiy 我试过这个,但它不起作用:(我也尝试使用 PropertyChangedEventHandler 但它也失败了
标签: c# wpf data-binding