另一个项目 Control/Data 模板中的项目控制和项目模板
Items Control and Items Template within another Items Control/Data Template
我正在尝试显示一个 Items 控件,其中包含另一个代表 LED 指示灯数组的 Items 控件。 LED 阵列和主 Item Control 中的所有其他数据都绑定到一个 Observable 集合。我无法显示 LED 阵列。我也知道我在使用 IValueConverter 将字节转换为画笔颜色时遇到问题(整个字节数组都进来了,但我希望它一次只处理一个元素,即使我对 return 值进行硬编码LED 不显示)。我只是不知道我做错了什么(我对这一切都很陌生)。在此先感谢您的任何建议!
我的 ValueConverter 隐藏代码
namespace Test
{
public class ByteToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((byte)value == 1) ? Brushes.LightGreen : Brushes.DarkOliveGreen;
}
}
class userData : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private byte[] led;
public byte[] Led
{
get { return led; }
set
{
byte[] input = value;
if (input != this.led)
{
this.led = input;
NotifyPropertyChanged();
}
}
}
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我的Xaml代码
<Window x:Class="Test.MainWindow"
xmlns:src="clr-namespace:Test"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" WindowState="Maximized" WindowStyle="None">
<Window.Resources>
<src:ByteToBrushConverter x:Key="LEDConverter" />
<DataTemplate x:Key="myLedTemplate" DataType="{x:Type sys:Byte}">
<Grid>
<Border Height="12" Width="12" BorderThickness="1" BorderBrush="Black" Background="{Binding Led,Converter={StaticResource LEDConverter}}" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="myHwTemplate">
<Grid Margin="10,10,10,10" MinWidth="110" MinHeight="90">
<Border BorderBrush="Black" BorderThickness="2" >
<Grid Margin="0,0,0,0" >
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" x:Name="userControlNameLabel" Content="{Binding Path=name}" />
<Label Grid.Row="1" x:Name="powerLabel" Background="{Binding Path=Power, Converter={StaticResource int2color}}" HorizontalAlignment="Stretch" Content="Powered" HorizontalContentAlignment="Center" Margin="5,1,5,1" />
<Grid Grid.Row="2" Margin="5,5,0,0">
<ItemsControl ItemsSource="{Binding Path=Led,Converter={StaticResource LEDConverter}}" ItemTemplate="{StaticResource myLedTemplate}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</Grid>
</Border>
</Grid>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid Margin="0,60,0,0" >
<ItemsControl Name="ssedu0ItemControl" ItemTemplate="{StaticResource myHwTemplate}" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Disabled" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical" IsItemsHost="True"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</Grid>
</Window>
这是我的主要代码
namespace Test
{
public partial class MainWindow : Window
{
private ObservableCollection<userData> ssedu0LBData = new ObservableCollection<userData>();
public MainWindow()
{
InitializeComponent();
for (int i = 0; i < Properties.Settings.Default.unit.Count; i++)
ssedu0LBData.Add(new userData(Properties.Settings.Default.unit[i]));
ssedu0ItemControl.ItemsSource = ssedu0LBData;
for(int i=0;i<8;i++)
ssedu0LBData[1].Led[i] = 1;
}
}
}
你的主要问题在这里:
ItemsSource="{Binding Path=Led,Converter={StaticResource LEDConverter}}"
您不希望通过转换器运行 集合,当然您的转换器当前无法处理集合。所以那一行应该是:
ItemsSource="{Binding Path=Led}"
稍后您将在该 ItemsControl 的数据模板中使用转换器,当您执行类似以下操作时:
<Border BorderBrush="{Binding Path=. Converter={StaticResource LEDConverter}}"/>
关于您的代码的警告。更改该数组的单个元素将 不会 传播到 UI。您需要在实现 INPC 的 byte
周围使用包装器,或者只替换整个数组而不是更改单个元素。
我正在尝试显示一个 Items 控件,其中包含另一个代表 LED 指示灯数组的 Items 控件。 LED 阵列和主 Item Control 中的所有其他数据都绑定到一个 Observable 集合。我无法显示 LED 阵列。我也知道我在使用 IValueConverter 将字节转换为画笔颜色时遇到问题(整个字节数组都进来了,但我希望它一次只处理一个元素,即使我对 return 值进行硬编码LED 不显示)。我只是不知道我做错了什么(我对这一切都很陌生)。在此先感谢您的任何建议!
我的 ValueConverter 隐藏代码
namespace Test
{
public class ByteToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((byte)value == 1) ? Brushes.LightGreen : Brushes.DarkOliveGreen;
}
}
class userData : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private byte[] led;
public byte[] Led
{
get { return led; }
set
{
byte[] input = value;
if (input != this.led)
{
this.led = input;
NotifyPropertyChanged();
}
}
}
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我的Xaml代码
<Window x:Class="Test.MainWindow"
xmlns:src="clr-namespace:Test"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" WindowState="Maximized" WindowStyle="None">
<Window.Resources>
<src:ByteToBrushConverter x:Key="LEDConverter" />
<DataTemplate x:Key="myLedTemplate" DataType="{x:Type sys:Byte}">
<Grid>
<Border Height="12" Width="12" BorderThickness="1" BorderBrush="Black" Background="{Binding Led,Converter={StaticResource LEDConverter}}" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="myHwTemplate">
<Grid Margin="10,10,10,10" MinWidth="110" MinHeight="90">
<Border BorderBrush="Black" BorderThickness="2" >
<Grid Margin="0,0,0,0" >
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" x:Name="userControlNameLabel" Content="{Binding Path=name}" />
<Label Grid.Row="1" x:Name="powerLabel" Background="{Binding Path=Power, Converter={StaticResource int2color}}" HorizontalAlignment="Stretch" Content="Powered" HorizontalContentAlignment="Center" Margin="5,1,5,1" />
<Grid Grid.Row="2" Margin="5,5,0,0">
<ItemsControl ItemsSource="{Binding Path=Led,Converter={StaticResource LEDConverter}}" ItemTemplate="{StaticResource myLedTemplate}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</Grid>
</Border>
</Grid>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid Margin="0,60,0,0" >
<ItemsControl Name="ssedu0ItemControl" ItemTemplate="{StaticResource myHwTemplate}" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Disabled" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical" IsItemsHost="True"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</Grid>
</Window>
这是我的主要代码
namespace Test
{
public partial class MainWindow : Window
{
private ObservableCollection<userData> ssedu0LBData = new ObservableCollection<userData>();
public MainWindow()
{
InitializeComponent();
for (int i = 0; i < Properties.Settings.Default.unit.Count; i++)
ssedu0LBData.Add(new userData(Properties.Settings.Default.unit[i]));
ssedu0ItemControl.ItemsSource = ssedu0LBData;
for(int i=0;i<8;i++)
ssedu0LBData[1].Led[i] = 1;
}
}
}
你的主要问题在这里:
ItemsSource="{Binding Path=Led,Converter={StaticResource LEDConverter}}"
您不希望通过转换器运行 集合,当然您的转换器当前无法处理集合。所以那一行应该是:
ItemsSource="{Binding Path=Led}"
稍后您将在该 ItemsControl 的数据模板中使用转换器,当您执行类似以下操作时:
<Border BorderBrush="{Binding Path=. Converter={StaticResource LEDConverter}}"/>
关于您的代码的警告。更改该数组的单个元素将 不会 传播到 UI。您需要在实现 INPC 的 byte
周围使用包装器,或者只替换整个数组而不是更改单个元素。