2014-02-28 15 views
0

我在WPF中有一個ListView的問題。 我的程序有兩個ListView控件:一個使用數據綁定與ObservableCollection綁定,該ObservableCollection位於我的窗口內,另一個綁定到第一個集合的每個項目內的ObservableCollection。從CellTemplate到ListViewItem數據的數據綁定

像這樣:

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; } 
    } 
    ... 
} 

而且,這兩個名單的定義是這樣的:

我的窗口內的ObservableCollection第一ListView中的數據綁定到

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

XAML爲先ListView

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

XAML第二的ListView

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

一切工作正常現在。我的問題是第二個ListView必須是可編輯的,並且爲了這樣做,我已經以這種方式自定義了其用於eact GridColumn的CellTemplate(帶有一些觸發器來啓用和禁用編輯)(這是第一列的示例但thay're全部相等):

<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,但我無法讓它工作。

有沒有人有想法?

我很抱歉我已經這麼久了,但我不知道如何解釋它。

謝謝大家! :)

+0

它是什麼:在第二個ListView XAML defenition中的SelectedItem.Dosaggi?可能它應該是'SelectedItem'只? – Jasper

+0

SelectedItem指向第一個ListView中選擇的項目,在我的案例中,它屬於Fitosanitario類型。因此SelectedItem.Dosaggi指向了Fitosanitario類中的ObservableCollecation calles「Dosaggi」。 如果我只將SelectedItem而不是SelectedItem.Dosaggi,第二個列表始終爲空。 – zeb

回答

1

你已經完全複雜的情況。只要定義DataTemplateDosaggio類是這樣的:

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

你最好不要使用TextBox.IsReadOnly屬性,以使一個TextBox不可編輯,但你需要扭轉你InEditing財產的極性,使其工作並可能將其重命名爲IsNotEditing。此外,如果您的Dosaggio類中的此屬性爲而非,那麼您將必須更改Binding才能訪問它。

以備將來參考:

你並不需要使用兩個DataTrigger s到你在你的例子在做什麼。你可以這樣做,而不是:

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

如果你打算使用ContentControl,那麼你就需要設置其屬性Content

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

非常感謝您的回答。我試圖改變DataTemplate,就像你第一次建議我一樣,它的工作原理。 TextBox顯示數據。 但我真正的目標不是始終顯示TextBox,而是啓用和禁用編輯,但僅當啓用編輯時才顯示TextBox,才能向用戶顯示正常的ListView,但是當他啓用編輯時,在選定的行中顯示文本框。這就是爲什麼我使用觸發器來顯示文本框,但他們沒有從數據綁定中獲取數據。 你有什麼想法如何做到這一點? 謝謝你謝里登。 – zeb