将数组工具提示添加到LED阵列的数据模板中

时间:2015-02-11 13:12:42

标签: arrays wpf data-binding tooltip datatemplate

我在这个问题上被困了很长时间。我尝试了很多选项,但我无法正确理解语法。我尝试过的所有选项都显示数据类型,所有元素的相同名称,空白工具提示,无工具提示或LED位值。我可以显示一个LED数组,其中颜色由位值确定,但我需要将每个元素的名称添加到工具提示中。我使用数据模板来显示数组。

我最近的xaml:

    <Window.Resources>           
        <DataTemplate x:Key="myLedTemplate" DataType="{x:Type sys:Byte}" >
                <Border ... Background="{Binding Converter={StaticResource LEDConverter}}" ToolTip="{Binding Ledname}"/>              
        </DataTemplate>
        <DataTemplate x:Key="myHwTemplate">            
            <Grid>
               <Border>
                    <Grid>
                        <ItemsControl ItemsSource="{Binding Path=Led}" ItemTemplate="{StaticResource myLedTemplate}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
                            <ItemsControl.ItemsPanel>
                                ...
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ToolTip>
                                <ToolTip>
                                    <TextBlock Text="{Binding Path=Ledname}"/>
                                </ToolTip>
                            </ItemsControl.ToolTip>
                        </ItemsControl>                                 
                    </Grid>
                </Border>
            </Grid>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ItemsControl Name="hwItemControl" ItemTemplate="{StaticResource myHwTemplate}" ... >
                ...
        </ItemsControl>
    </Grid>
</Window>

我的班级类型

private byte[] led;
public byte[] Led
{
    get { return led; }
    set
    {
        byte[] input = value;
        if (input != this.led)
        {
            this.led = input;
            NotifyPropertyChanged();
        }
    }
}

private string[] ledname;
public string[] Ledname
{
    get { return ledname; }
    set
    {
        string[] input = value;
        if (input != this.ledname)
        {
            this.ledname = input;
            NotifyPropertyChanged();
        }
    }
} 

现在,如果我将鼠标悬停在LED元素上,它会显示&#34; string [] Array&#34;。感谢您提供的任何建议。

1 个答案:

答案 0 :(得分:0)

您正在绑定到一个字节数组,并且在您的项目模板中,您正在尝试获取led名称,但它位于不同的数组中。您的项目模板将仅引用ItemsSource属性的对象类型。

请改为尝试:

public class LED : INotifyPropertyChanged
{
    private int _Value;

    public int Value
    {
        get { return _Value; }
        set { _Value = value; NotifyPropertyChanged(); }
    }

    private string _Name;

    public string Name
    {
        get { return _Name; }
        set { _Name = value; NotifyPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged([CallerMemberName]string propertyName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

创建一个名为LED的对象,它将保存您的LED值和LED名称,然后您可以使用此类的ObservableCollection并绑定到它。

public ObservableCollection<LED> LEDs { get; set; }

将ItemsSource绑定到集合LED,并绑定到项目模板中LED类中的属性。

<ItemsControl ItemsSource="{Binding Path=LEDs}" ...

<ItemsControl.ToolTip>
   <ToolTip>
     <TextBlock Text="{Binding Path=Name}"/>
   </ToolTip>
</ItemsControl.ToolTip>