user1312703
user1312703

Reputation:

Binding individual ListView items created in XAML

I have a ListView with ListViewItem's created statically in XAML. I want to bind ListViewItem's properties to different properties in my View Model given as a DataContext for ListView. But my code does not work:

<ListView AlternationCount="2" Name="listView">        
    <ListView.View>
        <GridView>
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Title}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Binding.TargetUpdated="TargetUpdated" Text="{Binding Value}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Units}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding About}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>

    <l:PropertyItem Title="title" Value="{Binding Path=DeviceCode}" Units="units" About="about"/>
    <l:PropertyItem Title="title" Value="{Binding Path=VendorName}" Units="units" About="about"/>
    <l:PropertyItem Title="title" Value="{Binding Path=Version}" Units="units" About="about"/>
</ListView>

Where NumericItem is:

internal class PropertyItem : DependencyObject
{
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(String), typeof(PropertyItem), new PropertyMetadata(String.Empty));

    public static readonly DependencyProperty TitleProperty =
        DependencyProperty.Register("Title", typeof(String), typeof(PropertyItem), new PropertyMetadata(String.Empty));

    public static readonly DependencyProperty UnitsProperty =
        DependencyProperty.Register("Units", typeof(String), typeof(PropertyItem), new PropertyMetadata(String.Empty));

    public static readonly DependencyProperty AboutProperty =
        DependencyProperty.Register("About", typeof(String), typeof(PropertyItem), new PropertyMetadata(String.Empty));



    public String Value
    {
        get
        {
            return (String)this.GetValue(ValueProperty);
        }

        set
        {
            this.SetValue(ValueProperty, value);
        }
    }

    public String Title
    {
        get
        {
            return (String)this.GetValue(TitleProperty);
        }

        set
        {
            this.SetValue(TitleProperty, value);
        }
    }

    public String Units
    {
        get
        {
            return (String)this.GetValue(UnitsProperty);
        }

        set
        {
            this.SetValue(UnitsProperty, value);
        }
    }

    public String About
    {
        get
        {
            return (String)this.GetValue(AboutProperty);
        }

        set
        {
            this.SetValue(AboutProperty, value);
        }
    }
}

Upvotes: 0

Views: 461

Answers (2)

user1312703
user1312703

Reputation:

I found the solution! My PropertyItem class derived from DependencyObject which in turn does not contain property DataContext. That's why the binding does not work. You need to derive from the one who has DataContext property, for example FrameworkElement and it will work!

Upvotes: 1

Sheridan
Sheridan

Reputation: 69985

Try using these Bindings:

<l:PropertyItem Title="title" Value="{Binding Path=DataContext.DeviceCode, 
    RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" Units="units" 
    About="about" />
<l:PropertyItem Title="title" Value="{Binding Path=DataContext.VendorName, 
    RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" Units="units"
    About="about"/>
<l:PropertyItem Title="title" Value="{Binding Path=DataContext.Version, 
    RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" Units="units" 
    About="about"/>

Here, we're binding to the DataContext of the parent of type ListView... I believe that's what you were after.

Upvotes: 0

Related Questions