【问题标题】:Data binding from CellTemplate to ListViewItem data从 CellTemplate 到 ListViewItem 数据的数据绑定
【发布时间】:2014-03-02 02:30:17
【问题描述】:

我遇到了 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>

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

有人有想法吗?

对不起,我已经这么久了,但我不知道如何解释。

谢谢大家! :)

【问题讨论】:

  • 它是什么:SelectedItem.Dosaggi 在第二个 ListView XAML 定义中?可能只应该是SelectedItem 吗?
  • SelectedItem 指向在第一个 ListView 上选择的项目,在我的例子中是 Fitosanitario 类型。所以 SelectedItem.Dosaggi 指向 Fitosanitario 类中的 ObservableCollecation 调用“Dosaggi”。如果我只是放置 SelectedItem 而不是 SelectedItem.Dosaggi,则第二个列表始终为空。

标签: c# wpf xaml listview


【解决方案1】:

你完全把情况复杂化了。只需像这样为您的Dosaggio 类定义DataTemplate

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

您最好使用TextBox.IsReadOnly 属性使TextBox 不可编辑,但您需要反转InEditing 属性的极性以使其工作,并且可能将其重命名为IsNotEditing。此外,如果此属性在您的 Dosaggio 类中不是,那么您必须更改 Binding 才能访问它。

供您将来参考:

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

<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>


更新>>>

如果你要使用ContentControl,那么你需要设置它的Content属性:

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

【讨论】:

  • 非常感谢您的回答。我已经尝试像您第一次建议我那样更改 DataTemplate 并且它有效。 TextBox 显示数据。但我真正的目标不是总是显示一个 TextBox 并且只是启用和禁用编辑,而是仅在启用编辑时显示一个 TextBox,以便向用户显示一个正常的 ListView,但是当他启用编辑时,显示所选行中的文本框。这就是为什么我使用触发器来显示 TextBox,但它们没有从数据绑定中获取数据。你知道如何做到这一点吗?再次感谢谢里登。
猜你喜欢
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2015-05-31
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多