在Checkboxlist中为特定项目选中的WPF添加文本框

时间:2015-08-27 11:43:05

标签: c# wpf xaml devexpress

我正在使用WPF创建一个应用程序。我可以使用以下代码绑定Checkboxlist: 的 XAML:          

    <DataTemplate x:Key="defaultTemplate">
        <dxe:CheckEdit x:Name="lstcheckbox" Checked="lstcheckbox_Checked_1" Content="{Binding Name}" IsChecked="{Binding Path=Checked}" />
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=Checked}" Value="true">
                <Setter TargetName="lstcheckbox" Property="ContentTemplate" Value="{DynamicResource Template1}"/>
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
    <DataTemplate x:Key="Template1">
        <TextBox Width="100"></TextBox>
    </DataTemplate>
    <local:SomeTemplateSelector x:Key="SomeTemplateSelector" DefaultTemplate="{StaticResource defaultTemplate}"
                                                             Template1="{StaticResource Template1}">

    </local:SomeTemplateSelector>
</Window.Resources>
<Grid>
    <dxd:DockLayoutManager x:Name="dockManager" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible">
        <dxd:LayoutGroup Caption="Review Checklist" Orientation="Vertical" ShowCaption="True" GroupBorderStyle="Group" CaptionAlignMode="AlignInGroup">
            <dxd:LayoutControlItem>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                    </Grid.RowDefinitions>
                    <TextBlock Grid.Column="0" Grid.Row="0" Margin="8,5,5,5">Safety Equipment</TextBlock>
                    <!--<ListView x:Name="lstSafEquip" Grid.Column="0" Grid.Row="1" BorderThickness="0" Margin="5,5,5,5" SelectionMode="Multiple" ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource SomeTemplateSelector}" ItemTemplate="{StaticResource ItemDataTemplate}" IsSynchronizedWithCurrentItem="true" ScrollViewer.VerticalScrollBarVisibility="Auto" MaxHeight="200" />-->
                    <ListView x:Name="lstSafEquip" Grid.Column="0" Grid.Row="1" BorderThickness="0" Margin="5,5,5,5" ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource SomeTemplateSelector}" IsSynchronizedWithCurrentItem="true" ScrollViewer.VerticalScrollBarVisibility="Auto" MaxHeight="200" />
                </Grid>
            </dxd:LayoutControlItem>
        </dxd:LayoutGroup>
    </dxd:DockLayoutManager>
</Grid>

CS:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        BindCheckBoxs(lstSafEquip);
    }

    private void BindCheckBoxs(ListView lst)
    {
        try
        {
            ObservableCollection<Data> Source = new ObservableCollection<Data> { new Data(1, "Apple"), new Data(2, "Mango"), new Data(3, "Others"), new Data(3, "Banana"), new Data(3, "Grapes") };
            lst.ItemsSource = Source;
        }
        catch (Exception ex)
        {

            throw new Exception(ex.Message.ToString());
        }

    }

}


public class SomeTemplateSelector : DataTemplateSelector
{
    public DataTemplate Template1 { get; set; }
    public DataTemplate DefaultTemplate { get; set; }
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        Data _Item = (Data)item;
        if (_Item.Name == "Others")
        {
            return Template1;
        }
        return DefaultTemplate; 
    }
}

DATA.CS:

public class Data
{
    public int ID { get; set; }
    public string Name { get; set; }
    public bool Checked { get; set; }

    public Data(int _ID, string _Name)
    {
        ID = _ID;
        Name = _Name;
        Checked = false;
    }
}

问题:

当用户选中此项时,我想在复选框列表项其他下方添加文本框。 通过使用上面的代码触发器,我检查时输入每个项目的文本框。 enter image description here

请让我知道我哪里出错了。如果需要,我会尽力提供更多信息。

3 个答案:

答案 0 :(得分:2)

根据我对你的帖子和评论的理解: 添加一个TextBox作为Barptad建议,但使用如下所述的BooleanToVisibilityCollapsed转换器:

<强> BooleanToVisibilityCollapsedConverter.cs:

public class BooleanToVisibilityCollapsedConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        return ((bool) value) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture) { 
        //never used 
        return null;
    }
}

<强> XAML:

<DataTemplate x:Key="defaultTemplate">
    <StackPanel>
        <dxe:CheckEdit x:Name="lstcheckbox" Checked="lstcheckbox_Checked_1" Content="{Binding Name}" IsChecked="{Binding Path=Checked}" />
        <TextBox Visibility="{Binding IsChecked, ElementName=lstcheckbox}"/>
    </StackPanel>
</DataTemplate>

如果您使用Visibility.Hidden,则文本框不可见但仍然会发生。

答案 1 :(得分:1)

合并所有建议和评论后。我找到了解决方案。

<强> XAML:

在默认模板中添加了文本框

#menu-button:hover {
    background-color: blue;
}

<强> XAML.CS:

 <DataTemplate x:Key="defaultTemplate">
        <StackPanel>
            <dxe:CheckEdit x:Name="lstcheckbox" Checked="lstcheckbox_Checked_1" Unchecked="lstcheckbox_Checked_1" Content="{Binding Name}" IsChecked="{Binding Path=Checked}" />
            <TextBox Name="txtOther" Visibility="{Binding Path=Visible}" Text="test" Width="100"></TextBox>
        </StackPanel>
    </DataTemplate>

<强> DATA.CS:

添加了可见属性并使用INotifyPropertyChanged继承以跟踪Data.cs中属性的更改

  private void lstcheckbox_Checked_1(object sender, RoutedEventArgs e)
    {
        Data some = (sender as CheckEdit).DataContext as Data;
        if (some.Name.Contains("Others"))
        {
            some.Visible = ToggleVisibility(some.Visible);
        }
    }
    private Visibility ToggleVisibility(Visibility visibility)
    {
        return visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
    }

<强> SomeTemplateSelector.CS

public class Data : INotifyPropertyChanged
{
    private Visibility _visible;
    public int ID { get; set; }
    public string Name { get; set; }
    public bool Checked { get; set; }
    //public Visibility Visible { get; set; }

    public Visibility Visible
    {
        get { return this._visible; }
        set
        {
            this._visible = value;
            RaisePropertyChanged("Visible");
        }

    }

    public Data(int _ID, string _Name,Visibility _visible)
    {
        ID = _ID;
        Name = _Name;
        Visible = _visible;
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

希望这会有所帮助。

答案 2 :(得分:0)

纠正我如果我是狼人! 您希望仅在“其他”项目下显示文本框。

对于上面提到的场景,你需要有两个不同的模板来改变item的值。

例如,如果项目是“其他”,则它应该具有在复选框下面有一个文本框的模板复选框,只有在选中复选框时才会显示,否则会折叠。

对于第二种类型的项目,即使选中它也应该有不同的模板。

(步骤1)创建模板选择器

public class ValueDataTemplateSelector : DataTemplateSelector
    {
        public DataTemplate DefaultTemplate { get; set; }
        public DataTemplate OthersTemplate { get; set; } 

        public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
        {
            DataTemplate template = DefaultTemplate;

            CheckList data = item as CheckList;
            if (data.Description.Contains("Others"))
            {
                template = OthersTemplate;
            }

            return template;
        }

    }

文件中的参考装配。 (步骤3)创建两个模板,如下所示

<Window.Resources>
        <DataTemplate x:Key="DefaultTemplate">
            <StackPanel>
                <CheckBox IsChecked="{Binding Path=IsChecked}" Content="{Binding Path=Description}"></CheckBox>
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="OthersTemplate">
            <DataTemplate.Resources>
                <Style TargetType="TextBox">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=IsChecked}" Value="false">
                            <Setter Property="Visibility" Value="Collapsed"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataTemplate.Resources>
            <StackPanel>
                <CheckBox IsChecked="{Binding Path=IsChecked}" Content="{Binding Path=Description}"></CheckBox>
                <TextBox x:Name="othersTextBox">
                </TextBox>
            </StackPanel>
        </DataTemplate>
        <local:ValueDataTemplateSelector x:Key="CheckListTemplateSelector"
                                        DefaultTemplate="{StaticResource DefaultTemplate}"
                                         OthersTemplate="{StaticResource OthersTemplate}"/>


    </Window.Resources>