2015-02-05 51 views
1

我正在一個WPF頁面上有以下幾點:WPF:在禁用物品界的ItemsControl

<ItemsControl ItemsSource="{Binding Peopl.PhoneNums}" x:Name="PhoneList"> 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
    <Grid> 
     <StackPanel Orientation="Horizontal" Margin="0,0,0,0" x:Name="PhoneEntry"> 
      <TextBlock Text="123-456-78901"/> 
      <ComboBox ...> 
     </StackPanel> 
     </Grid> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

可以有多個stackpanels,每一個獨特的電話號碼;在後面的代碼中,每個電話號碼都有一個指示是否應該啓用的標誌;我希望能夠以啓用基於該標記堆棧面板中的每個條目,但我被困在訪問它....

我:

foreach (Phone phone in PhoneList.ItemsSource) 
      { 
       if (phone.ShouldBeDisabled) 
       { 
        int index = PhoneList.Items.IndexOf(phone); 
        PhoneList.IsEnabled = false; 
        //this disables the entire control; 

        // I can't access "PhoneEntry" here... hmm 
       } 
      } 

有沒有一種方法來禁用只有一個一次進入?我怎樣才能訪問PhoneEntry?我應該嘗試根據綁定值禁用每個堆棧面板條目嗎?

+0

不要在代碼中這樣做。每個PhoneEntry StackPanel的DataContext都應該是您的Phone項目。將您的禁用屬性綁定到ShouldBeDisabled應該是答案。視圖關注視圖模型,視圖模型不操縱視圖。 – 2015-02-05 17:01:20

回答

4

您可能會反轉您的視圖模型屬性並將其命名爲ShouldBeEnabled。現在你可以綁定StackPanel的IsEnabled屬性。

<StackPanel ... IsEnabled="{Binding ShouldBeEnabled}"> 
    ... 
</StackPanel> 

如果你不能改變視圖模型,你可以使用反轉屬性值綁定轉換器:

<StackPanel ... IsEnabled="{Binding ShouldBeDisabled, 
          Converter={StaticResource InverseBooleanConverter}}"> 
    ... 
</StackPanel> 

電話號碼類必須實現INotifyPropertyChanged接口和火PropertyChanged事件當ShouldBeDisabled屬性的值更改。