2015-02-05 50 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属性的值更改。