更改列表框选择更改时的项目复选框

时间:2014-01-16 10:39:10

标签: c# silverlight templates checkbox listbox

我有一个由ItemTemplate和Binding

创建的ListBox
        <controls:PanoramaItem Header="{Binding AppResources.SettingsSubpage2, Source={StaticResource LocalizedStrings}}" HeaderTemplate="{StaticResource HeaderTemplate}">
            <Grid>
                <ListBox x:Name="DayOfWeekSelector" ItemTemplate="{StaticResource DayOfWeekTemplate}" ItemsSource="{Binding DayOfWeekElementList}" Foreground="{StaticResource AppForegroundColor}" LostFocus="DayOfWeekSelector_LostFocus" HorizontalAlignment="Left" Width="420" />
            </Grid>
        </controls:PanoramaItem>

模板代码:

<phone:PhoneApplicationPage.Resources>
   <!--- ... --->
<DataTemplate x:Key="DayOfWeekTemplate">
        <Grid Height="65" Width="332">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="60"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <CheckBox IsChecked="{Binding IsActive, Mode=TwoWay}" Tag="{Binding}" d:LayoutOverrides="Width, Height" BorderBrush="{StaticResource AppBackgroundColor}" Background="{StaticResource ScheduleBackgroundAccentsColor}" Grid.Column="0" Unchecked="CheckBox_Unchecked" />
            <StackPanel Grid.Column="1" Orientation="Horizontal">
            <TextBlock Text="{Binding Name}" VerticalAlignment="Center"  d:LayoutOverrides="Width"/>
                <TextBlock Text="{Binding TaskCounter, Mode=OneWay, Converter={StaticResource DayOfWeekCounter}}" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10,0,0,0"/>
            </StackPanel>
        </Grid>
    </DataTemplate>
   <!--- ... --->

它工作正常。我的所有物品都在列表中。复选框绑定到适当的元素(单击它正在更改正确的值)。

但默认情况下也可以选择ListBox。选择高亮度TextBox绑定到Name但不更改CheckBox(绑定到IsActive)。如何将项目选择更改为复选框状态更改(在Silverlight中)?

编辑:

public partial class SettingsPage : PhoneApplicationPage, INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    public List<DayOfWeekElement> DayOfWeekList
    {
        get
        {
            return CyberSyncPlanBase.Instance.DayOfWeekElementList;
        }
        set
        {
            CyberSyncPlanBase.Instance.DayOfWeekElementList = value;
            NotifyPropertyChanged("DayOfWeekList");
        }
    }

   public SettingsPage()
    {
        InitializeComponent();
        DayOfWeekSelector.DataContext = CyberSyncPlanBase.Instance;

    }

 private void DayOfWeekSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DayOfWeekElement dowe = (DayOfWeekElement) DayOfWeekSelector.SelectedItem;

        if (dowe != null)
            dowe.IsActive = (dowe.IsActive) ? false : true;
    }

在单身INotifyPropertyChanged我以同样的方式实现:

    private List<DayOfWeekElement> dayOfWeekElementList;
    public List<DayOfWeekElement> DayOfWeekElementList 
    { 
        get { return dayOfWeekElementList; }
        set 
        { 
        dayOfWeekElementList = value;
        RecalcWeekTasks();
        NotifyPropertyChanged("DayOfWeekElementList");
        } 
    }

底层课程:

public class DayOfWeekElement
{
    public string Name { get { return this.DayOfWeek.ToStringValue(); } }
    public bool IsNotEmpty { get { return (TaskCounter > 0); } }
    public int TaskCounter { get; set; }
    public bool IsActive { get; set; }
    public DayOfWeek DayOfWeek { get; set; }
}

1 个答案:

答案 0 :(得分:1)

我认为您可以使用ListBox控件的SelectedItem属性。

可能的实现方式是:

  1. 订阅ListBox的活动SelectedIndexChanged
  2. 获取所选项目。
  3. 对于所选项目,请将其IsActive属性更改为true
  4. 如果在数据类中实现了接口INotifyPropertyChanged,则此方法有效。

    E.g:

    public class DayOfWeekElement : INotifyPropertyChanged
    {
       public event PropertyChangedEventHandler PropertyChanged;
    
       private void NotifyPropertyChanged(string propertyName)
       {
           if (PropertyChanged != null)
           {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
           }
       }
    
    
       private bool isActive = false;
       public bool IsActive { 
          get
          {
              return this.isActive;
          } 
          set
          {
              if (value != this.isActive)
              {
                 this.isActive= value;
                 NotifyPropertyChanged("IsActive");
              }
          }  
       }
    }