用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));
}
- 你必须像我说的那样用
ObservableCollection<int>
替换 int[] 。它不适用于简单数组,因为 UI 不会收到有关更改的通知。
- 将 x:Name="Items" 添加到您的 ItemsControl 以便能够从后面的代码访问它;
- 在您的 RegionGrowing 中添加此代码:var ds = (DicomChart) Items.DataContext;
- 向您的 ds 对象添加值,例如 ds.ChartValues.Add(
).
我的数据绑定有问题(绑定更新?)。启动应用程序后,我加载图像并希望以 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));
}
- 你必须像我说的那样用
ObservableCollection<int>
替换 int[] 。它不适用于简单数组,因为 UI 不会收到有关更改的通知。 - 将 x:Name="Items" 添加到您的 ItemsControl 以便能够从后面的代码访问它;
- 在您的 RegionGrowing 中添加此代码:var ds = (DicomChart) Items.DataContext;
- 向您的 ds 对象添加值,例如 ds.ChartValues.Add(
).