2016-02-19 42 views
1

我被卡在WPF中的動畫。我需要在數據網格中設置一行(閃爍),在該行中檢查所有複選框選項(總計3)。wpf datagrid中的閃爍行不起作用

<DataGrid x:Name="employeesGrid" SelectedItem="{Binding SelectedRow, Mode=TwoWay}" SelectedIndex="{Binding SelectedEmployeeIndex, Mode=TwoWay}" Style="{StaticResource dataGridStyle}" ItemsSource="{Binding Employees}"> 

     <DataGrid.ItemContainerStyle> 
      <Style TargetType="{x:Type DataGridRow}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=NumberOfSkills}" Value="3"> 
         <DataTrigger.EnterActions> 
          <BeginStoryboard x:Name="blinkingRow"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:0.5" RepeatBehavior="Forever" AutoReverse="true" /> 
           </Storyboard> 
          </BeginStoryboard> 
         </DataTrigger.EnterActions> 
         <DataTrigger.ExitActions> 
          <BeginStoryboard x:Name="notBlinkingRow"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="1" Duration="0:0:0.5" RepeatBehavior="Forever" AutoReverse="true" /> 
           </Storyboard> 
          </BeginStoryboard> 
         </DataTrigger.ExitActions> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </DataGrid.ItemContainerStyle> 

     <DataGrid.Columns> 
      ... 

      <DataGridTemplateColumn Header="Skills" IsReadOnly="False"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ListBox ItemsSource="{Binding Skills, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
             Command="{Binding Path=DataContext.SaveChangesCommand, RelativeSource={RelativeSource Mode=Self}}" /> 

           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      ... 

    </DataGrid> 

In view model I have。

public int NumberOfSkills 
    { 
     get 
     { 
      int count = 0; 
      foreach(Skill skill in ((EmployeeViewModel)SelectedRow).Skills) 
      { 
       if(skill.IsChecked) 
       { 
        count++; 
       } 
      } 
      return count; 
     } 
    } 

爲什麼這不起作用?我嘗試了很多我在互聯網上找到的解決方案,但沒有任何工作不成功。發佈的示例與msdn網站上的代碼非常相似,所以我真的不知道這裏有什麼問題。

+2

當你致電'NumberOfSkills'的PropertyChanged通知?它不在您發佈的代碼中,沒有它,DataGrid不會知道它已更改。 – icebat

回答

0

有幾個問題需要解決才能解決此問題。

get 
{ 
    int count = 0; 
    foreach(Skill skill in ((EmployeeViewModel)SelectedRow).Skills) 
    { 
     if(skill.IsChecked) 
     { 
      count++; 
     } 
    } 
    return count; 
} 

在裏面你應該只返回值,而不應更改任何值的屬性的獲取。它違反了 - [命令查詢分離的原則] [1]

而是直接返回私有變量_count

private int _count 
public int NumberOfSkills 
{ 
get 
{ 
    return _count; 
} 
set 
{ 
    _count = value; 
    NotifyPropertyChanged("NumberOfSkills") 
} 
} 

現在問題來了,你應該在哪裏設置NumberOfSkills邏輯?所以你應該保持在用戶/演員改變它的地方。

假設你設置了IsChecked屬性是由用戶界面設置的類的用戶的技能。您可以訂閱IsChecked PropertyChanged()並分隔更新NumberOfSkills的邏輯。

skill.PropertyChanged += SkillsPropertyChanged 

SkillsPropertyChanged(Object sender, PropertyChangedEventArgs e) 
{ 
    if(e.PropertyName ="IsChecked") 
    { 
    //Logic to update the NumberOfSkills 
    if(skill.IsChecked) 
    { 
     NumberOfSkills++; 
    } 
    else 
    { 
     NumberOfSkills--; 
    } 
    } 
} 

快速和簡單的方法來做到這一點與你現有的方法很簡單。當您設置IsCheckedProperty時,請致電NotifyPropertyChanged("NumberOfSkills")。雖然這可能不是直截了當,但希望你明白這一點。

private bool _isChecked; 
public bool IsChecked 
{ 
get {return _isChecked;} 
set 
{ 
    _isChecked = value; 
    NotifyPropertyChanged("IsChecked"); 
    NotifyPropertyChanged("NumberOfSkills"); 
} 
} 
+1

謝謝。我明白問題在哪裏,但我的Skill類是可序列化的,所以我必須創建一些SkillViewModel,現在我的代碼看起來很髒。有很多轉換...模型類包含List ,viewmodel包含ObservableCollection ... – gzsun