Как можно привязать отображаемые элементы столбцов ListView в пользовательском элементе управления к пользовательскому объекту? - PullRequest
1 голос
/ 03 января 2012

У меня есть UserControl, называемый b_StringBoolTemplate, который имеет ListView. Элементы ListView привязаны к его DependencyProperty, который называется Items. ListView имеет два столбца, один для текстового поля, а другой для флажка. Код XAML для UserControl:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Class="AutoCleaner.b_StringBoolTemplate"
    x:Name="b_StringBoolTemplate1"
    d:DesignWidth="310" d:DesignHeight="374">

    <Grid>
        <ListView ItemsSource="{Binding ElementName=b_StringBoolTemplate1, Path= Items}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="{Binding ElementName=b_StringBoolTemplate1, Path= StringLabel}" Width="150">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                 <TextBox Text="{Binding ElementName=StringBoolInfo, Path=Content}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Header="{Binding ElementName=b_StringBoolTemplate1, Path=BoolLabel}" Width="50" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                 <CheckBox IsChecked="{Binding BoolValue, ElementName=b_StringBoolInfo}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Width="50" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Button Name="btnDeleteItem" Content="Delete"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                </GridView>
            </ListView.View>
        </ListView>
    </Grid> 
</UserControl>

В выделенном фрагменте кода у меня есть объект с именем b_StringBoolInfo, который наследуется от ListViewItem и имеет два свойства зависимости, называемые StringContent и BoolValue. Я хочу, чтобы Textbox.Text привязывался к StringContent и Checkbox.IsChecked для привязки к BoolValue, поэтому я могу динамически добавлять элементы типа b_StringBoolInfo в UserControl.

Я также не уверен, что мой метод - лучший метод для этого. На всякий случай важно, чтобы связывание заголовков и ItemsSource с Dendency Props работало нормально.

Извините, если я немного расплывчатый. Спасибо за ваши ответы заранее.

Редактировать: Извините, если я не прояснил. Я добавил элементы типа b_StringBoolInfo в экземпляр UserControl, который находится в окне. Я пытаюсь связать TextBox.Text и Checkbox.IsChecked со свойствами b_StringBool, но не знаю, как.

В коде я написал класс с именем b_StringBoolInfo, который наследуется от ListViewItem:

public class b_StringBoolInfo :ListViewItem
    {


        public string StringContent
        {
            get { return (string)GetValue(StringContentProperty); }
            set { SetValue(StringContentProperty, value); }
        }

        // Using a DependencyProperty as the backing store for StringContent.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty StringContentProperty =
            DependencyProperty.Register("StringContent", typeof(string), typeof(b_StringBoolInfo),new PropertyMetadata("String"));



        public bool BoolValue
        {
            get { return (bool)GetValue(BoolValueProperty); }
            set { SetValue(BoolValueProperty, value); }
        }

        // Using a DependencyProperty as the backing store for BoolValue.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty BoolValueProperty =
            DependencyProperty.Register("BoolValue", typeof(bool), typeof(b_StringBoolInfo), new PropertyMetadata(true));



    }

Я добавил пользовательский элемент управления в окно, xaml под объектом UserControl, который называется b_StringBoolTemplate, и его элементы

<local:b_StringBoolTemplate Margin="64,67,159,145" StringLabel="Folder Location" BoolLabel="Search SubFolders?">
    <local:b_StringBoolTemplate.Items>

        <local:b_StringBoolInfo StringContent="String" BoolValue="True"/>

    </local:b_StringBoolTemplate.Items>
</local:b_StringBoolTemplate>

1 Ответ

0 голосов
/ 03 января 2012

Проблема в том, что следующие строки:

<TextBox Text="{Binding ElementName=StringBoolInfo, Path=Content}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" />

и

<CheckBox IsChecked="{Binding BoolValue, ElementName=b_StringBoolInfo}" /> 

Вы упомянули b_StringBoolInfo - переменная в коде позади.Но, с

ElementName = b_StringBoolInfo

Вы говорите XAML синтаксический анализатор для поиска Элемент / Элемент управления в вашем XAML файле с именем b_StringBoolInfo .

Чтобы исправить это,

Измените эти строки следующим образом:

<TextBox Text="{Binding Content}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" />

и

<CheckBox IsChecked="{Binding BoolValue}" /> 
...