2017-11-28 20 views
0

WPF에 대한 이전 컨트롤을 수정했습니다. 경보 목록을 표시하는 DataGrid를 만들어야합니다. DataGrid의 첫 번째 열은 플래그 아이콘과 날짜를 보유하는 DataGridtemplate 열입니다. 사용자가 버튼을 누르면 알람이 인식되고 깃발 아이콘이 사라집니다. MVVM 패턴을 사용하고 있습니다.DataGridTemplateColumn 업데이트

문제점은 datagridtemplate 열의 플래그를 업데이트 할 수 없다는 것입니다. 확인 상태를 0에서 1로 변경하면 (알람이 울린 후) 플래그가 사라지지 않습니다. 컨트롤을 다시로드하고 서버에서 알람을 다시 가져 오면 서버의 상태가 실제로 업데이트되었음을 ​​나타내는 플래그가 다시 표시되지 않습니다. 그래서 어떻게 든 내 코드는 작동하지만 UI가 업데이트되지 않습니다. 나는 또한 같은 방식으로 알람의 설명을 변경하려고 시도했는데 그 열은 업데이트되었습니다.

뷰 (MainViewModelBase는에서 INotifyPropertyChanged를 구현)

<DataGrid x:Class="Kwa.Presentation.Views.AlarmList.AlarmList" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Kwa.Presentation.Views.AlarmList" 
      xmlns:components="clr-namespace:Kwa.Presentation.Components" 
      xmlns:converters="clr-namespace:Kwa.Presentation.Converters" 
      xmlns:Trans="clr-namespace:Kwa.Presentation.Resources" 
      mc:Ignorable="d" 
      d:DesignHeight="500" d:DesignWidth="750" 
      ItemsSource="{Binding Alarms}" 
      SelectedItem="{Binding SelectedAlarm}" 
      IsSynchronizedWithCurrentItem="True" 
      CanUserResizeColumns="True" IsReadOnly="True" CanUserReorderColumns="False" CanUserSortColumns="False" SelectionMode="Single" CanUserAddRows="False" 
      Background="White" RowHeaderWidth="0" AutoGenerateColumns="False" GridLinesVisibility="None" RowHeight="{Binding Rowheight}" FrozenColumnCount = "1" 
      ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" 
      x:Name="AlarmFramework" 
      SizeChanged="AlarmFramework_SizeChanged" 
      > 

    <DataGrid.Resources> 
     <converters:AlarmSeverityToColorConverter x:Key="AlarmSeverityToColorConverter"/> 
     <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter"/> 
     <converters:InvertedBoolToVisibilityConverter x:Key="InvertedBoolToVisibilityConverter"/> 
</DataGrid.Resources> 

    <DataGrid.Columns> 

     <DataGridTemplateColumn Header="{x:Static Trans:TranslatedResources.AlarmColumnHeaderTime}" Width="auto" HeaderStyle="{StaticResource WithButt}"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <components:FlagControl VerticalAlignment="Center" Height="15" Width="15" FlagColor="{Binding Severity, Converter={StaticResource AlarmSeverityToColorConverter}}" 
               Visibility="{Binding AckStatus, Converter={StaticResource InvertedBoolToVisibilityConverter}, Mode=TwoWay}"/> 
         <TextBlock Text="{Binding DateTimeString}" Padding="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
        </StackPanel> 

       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

     <DataGridTextColumn Header="{x:Static Trans:TranslatedResources.AlarmColumnHeaderSeverity}" Binding="{Binding SeverityString}" Width="auto" HeaderStyle="{StaticResource WithoutButt}"/> 

     <DataGridTextColumn Header="{x:Static Trans:TranslatedResources.AlarmColumnHeaderDescription}" Binding="{Binding Description}" d:Width="400" Width="*" HeaderStyle="{StaticResource WithoutButt}"/> 



    </DataGrid.Columns> 
</DataGrid> 

AlarmList보기 모델

public class AlarmListViewModel : MainViewModelBase 
{ 
#region Properties 
    private ObservableCollection<AlarmEntryViewModel> _alarms = new ObservableCollection<AlarmEntryViewModel>(); 
    public ObservableCollection<AlarmEntryViewModel> Alarms 
    { 
     get { return _alarms; } 
     set 
     { 
      _alarms = value; 
      RaisePropertyChanged(() => Alarms); 
     } 
    } 

    private AlarmEntryViewModel _selectedAlarm; 
    public AlarmEntryViewModel SelectedAlarm 
    { 
     get { return _selectedAlarm; } 
     set 
     { 
      _selectedAlarm = value; 
      RaisePropertyChanged(() => SelectedAlarm); 
     } 
    } 

    private int _acknowledgeAllowed; 
    public int AcknowledgeAllowed 
    { 
     get { return _acknowledgeAllowed; } 
     set 
     { 
      _acknowledgeAllowed = value; 
      RaisePropertyChanged(() => AcknowledgeAllowed); 
     } 
    } 


    private readonly IActionCommand _acknowledgeCommand; 
    public IActionCommand AcknowledgeCommand 
    { 
     get { return _acknowledgeCommand; } 
    } 

    public int MaxAcknowledgedAlarm; 
    public double RowHeight { get; set; } 
    public AlarmEntryViewModel AlarmToSend { get; set; } 

    #endregion 

    #region Constructor 

    public AlarmListViewModel() 
    { 
     if (!IsInDesignMode) 
     { 
      RowHeight = 30; 
     } 

     //Add command 
     _acknowledgeCommand = new ActionCommand<double>(p => Acknowledge(p)); 

    } 

    #endregion 

#region Private Methods 

     private void Acknowledge(double parameter) 
     { 
      if (AcknowledgeAllowed == 1) 
      { 
       try 
       { 
        //Get Datagrid width 
        double DatagridWidth = (double)parameter; 
        //Calculate the amount of fully visible alarms 
        int AmountVisible = (int)Math.Floor(DatagridWidth/RowHeight); 
        if (Alarms.Count < AmountVisible) 
        { 
         AlarmToSend = Alarms[Alarms.Count - 1]; 
         foreach(AlarmEntryViewModel alarm in Alarms) 
         { 
          alarm.AckStatus = true; 
          alarm.Description = "Iets nieuw"; 
         } 
        } 
        else 
        { 
         //Send the last visible alarm, 0 based => -1 
         AlarmToSend = Alarms[AmountVisible - 1]; 
         //Go to next visible alarm 
         SelectedAlarm = Alarms[AmountVisible]; 
        } 
        //Acknowledge alarms 
        _proxy.Send(AlarmToSend.AlarmNumber); 

       } 
       catch (Exception ex) 
       { 
        _viewManager.ShowDialog(new MessageDialogViewModel() 
        { 
         AskAnswer = false, 
         Text = ex.Message, 
         Title = TranslatedResources.AlarmAckSendErrorTitle, 
        }); 
       } 
      } 
      else 
      { 
       _viewManager.ShowDialog(new MessageDialogViewModel() 
       { 
        AskAnswer = false, 
        Text = TranslatedResources.AlarmAcknErrorMessage, 
        Title = TranslatedResources.AlarmAcknErrorTitle, 
       }); 
      } 


     } 

     #endregion 

AlarmListEntry보기 모델

public class AlarmEntryViewModel : MainViewModelBase 
    { 
    #region Fields 
    private readonly IViewManager _viewManager; 
    private readonly IDockManager _dockManager; 
    private string _description; 

    #endregion 

    #region Constructor 

    public AlarmEntryViewModel() 
    { 
    } 

    #endregion 

    #region Model & Proxy 

    private Alarm _model; 
    public Alarm Model 
    { 
     set { _model = value; } 
    } 

    public AlarmListServiceProxy Proxy { get; set; } 

    #endregion 

    #region Properties 

    public DateTime Time { get { return _model.Time; } } 

    public string DateTimeString { get { return _model.Time.ToString("dd/MM/yyyy hh:mm:ss"); } } 

    public int Severity { get { return _model.Severity; } } 

    public string SeverityString 
    { 
     get 
     { 
      if (_model.Severity == 0) 
       return "Melding"; 
      if (_model.Severity == 1) 
       return "Waarschuwing"; 
      if (_model.Severity == 2) 
       return "Fout"; 
      else 
       return "Niet gekend"; 
     } 
    } 

    public string Description 
    { 
     get 
     { 
      //string substring = _model.Description.Substring(_model.Description.Length - 1); 
      //if (substring.Equals("\n")) 
      //{ 
      // return _model.Description.Substring(0, _model.Description.Length - 1); 
      //} 
      //else 
      // return _model.Description; 
      return _description; 
     } 
     set 
     { 
      _description = value; 
      RaisePropertyChanged(() => Description); 
     } 
    } 

    public int AlarmNumber { get { return _model.Number; } } 

    public int AcknStatus { get { return _model.AcknStatus; } } 

    private bool _ackStatus; 
    public bool AckStatus 
    { 
     get 
     { 
      if (_model.AcknStatus == 0) 
       return false; 
      else 
       return true; 

     } 
     set 
     { 
      _ackStatus = value; 
      RaisePropertyChanged(() => AckStatus); 
     } 
    } 

    #endregion 


} 

답변

1

설정자에 _ackStatus을 설정했지만 AlarmEntryViewModel의 게터에서이 필드의 값을 반환하지 않습니다. 세터의 _model.AcknStatus 필드를

private bool _ackStatus; 
public bool AckStatus 
{ 
    get 
    { 
     return _ackStatus; 
    } 
    set 
    { 
     _ackStatus = value; 
     RaisePropertyChanged(() => AckStatus); 
    } 
} 

또는 설정 :이 작업을 수행 내가 바보 같은 느낌

private bool _ackStatus; 
public bool AckStatus 
{ 
    get 
    { 
     if (_model.AcknStatus == 0) 
      return false; 
     else 
      return true; 

    } 
    set 
    { 
     _ackStatus = value; 
     _model.AcknStatus = value ? 1 : 0; 
     RaisePropertyChanged(() => AckStatus); 
    } 
} 
+0

을, 정말 감사합니다! –