从CellTemplate到ListViewItem数据的数据绑定

时间:2014-02-28 14:08:46

标签: c# wpf xaml listview

我在WPF中遇到了ListView的问题。 我的程序有两个ListView控件:一个使用数据绑定绑定到我的Window中的ObservableCollection,另一个绑定到第一个集合的每个项目内的ObservableCollection。

像这样:

public class Fitosanitario : DBData
{
    private ObservableCollection<Dosaggio> _dosaggi;
    public ObservableCollection<Dosaggio> Dosaggi { set { _dosaggi = value; } get { return _dosaggi; } }
    ...
}

public class Dosaggio : DBData
{
    private int _idColtura;
    public int IDColtura
    {
        get { return _idColtura; }
        set { _idColtura = value; }
    }
    ...
}

这两个列表的定义如下:

我的Window中的ObservableCollection,第一个ListView将数据绑定到

private ObservableCollection<Fitosanitario> _fitosanitari;
public ObservableCollection<Fitosanitario> Fitosanitari
{
    get { return _fitosanitari; }
}

第一个ListView的XAML

<ListView Grid.Row="1" Margin="5" Name="lstProdottiFito">
    <ListView.View>
         <GridView>
             <GridViewColumn Header="Nome" Width="120" DisplayMemberBinding="{Binding Nome}" />
             <GridViewColumn Header="Quantità" Width="80" DisplayMemberBinding="{Binding Quantita}" />
             <GridViewColumn Header="Descrizione" Width="135" DisplayMemberBinding="{Binding Descrizione}" />
         </GridView>
    </ListView.View>
</ListView>

第二个ListView的XAML

<ListView Grid.Column="2" Margin="5" ItemsSource="{Binding SelectedItem.Dosaggi, ElementName=lstProdottiFito}" x:Name="lstDosaggi">
...
</ListView>

现在一切正常。我的问题是第二个ListView必须是可编辑的,为了做到这一点,我已经以这种方式为eact GridColumn(带有一些启用和禁用编辑的触发器)定制了它的CellTemplate(这是第一列的示例) ,但是它们都是平等的):

<GridViewColumn Header="IDColtura" Width="80">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <ContentControl>
                <ContentControl.Style>
                   <Style TargetType="{x:Type ContentControl}">
                       <Style.Triggers>
                           <DataTrigger Binding="{Binding InEditing}" Value="False">
                               <Setter Property="ContentTemplate">
                                   <Setter.Value>
                                       <DataTemplate>
                                           <TextBlock Text="{Binding IDColtura}"/>
                                       </DataTemplate>
                                   </Setter.Value>
                               </Setter>
                           </DataTrigger>
                           <DataTrigger Binding="{Binding InEditing}" Value="True">
                               <Setter Property="ContentTemplate">
                                   <Setter.Value>
                                       <DataTemplate>
                                           <TextBox Text="{Binding IDColtura, Mode=OneWay}"/>
                                       </DataTemplate>
                                   </Setter.Value>
                               </Setter>
                           </DataTrigger>
                       </Style.Triggers>
                   </Style>
               </ContentControl.Style>
           </ContentControl>
       </DataTemplate>
   </GridViewColumn.CellTemplate>
</GridViewColumn>

从“编辑模式”和“正常模式”切换工作,问题是TextBox或TextBox都没有显示文本。 我已经尝试了各种类型的DataBinding,但我无法让它工作。

有没有人有想法?

我很抱歉我已经这么久了,但我不知道如何解释它。

感谢大家! :)

1 个答案:

答案 0 :(得分:1)

你完全把情况弄得一团糟。只需为您的DataTemplate类定义Dosaggio,如下所示:

<DataTemplate DataType="{x:Type Dosaggio}">
    <TextBox Text="{Binding IDColtura}" IsReadOnly="{Binding IsNotEditing}" />
</DataTemplate>

您最好使用TextBox.IsReadOnly属性使TextBox无法使用,但您需要撤消InEditing属性的极性才能使其正常工作并重命名它到IsNotEditing。此外,如果此Dosaggio课程中的此属性,则您必须更改Binding才能访问它。

  

供将来参考:

您不需要使用两个DataTrigger来执行您在示例中所做的操作。你可以这样做:

<Style TargetType="{x:Type ContentControl}">
   <Setter Property="ContentTemplate">
       <Setter.Value>
           <DataTemplate>
               <TextBlock Text="{Binding IDColtura}"/>
           </DataTemplate>
       </Setter.Value>
   </Setter>
   <Style.Triggers>
       <DataTrigger Binding="{Binding InEditing}" Value="True">
           <Setter Property="ContentTemplate">
               <Setter.Value>
                   <DataTemplate>
                       <TextBox Text="{Binding IDColtura, Mode=OneWay}"/>
                   </DataTemplate>
               </Setter.Value>
           </Setter>
       </DataTrigger>
   </Style.Triggers>


UPADTE&gt;&gt;&gt;

如果您要使用ContentControl,则需要设置其Content属性:

<ContentControl Content="{Binding}">
    ...
</ContentControl>