File의 다운로드 현황에 따라 Datagrid Template을 유동적으로 보여주는 기능을 구현 중입니다.
구체적으로
- 다운로드가 시작되지 않으면 WaitingTemplate을,
- 시작하면 ProgressTemplate을,
- 완료되면 ComplateTemplate을 보여주려고 합니다.
하지만 문제가 발생한 부분이 File자체가 INotifyPropertyChanged 로 변경이 되면 이를 참고하는 값들이 변경이 일어남에도(실제로 ProgressTemplate 만을 사용할 경우에는 값이 변경됨에 따라 Progressbar가 변경됨을 확인 할 수 있었습니다.) 하기 영역이 변경되는 정보에 따라 ‘유동적으로’ DataTemplateSelector이 변경 되지 않은 것을 확인할 수 있습니다. 그냥 초기에 호출되는 WaitingTemplate만 계속 보입니다.
<temp:ProgressTemplateSelector CompleteTemplate="{StaticResource CompleteTemplate}"
ProgressTemplate="{StaticResource ProgressTemplate}"
WaitingTemplate="{StaticResource WaitingTemplate}" />
DataTemplateSelector의 변경을 Dynamic하게 변경하려면 어떤 부분을 수정해야할지 의견을 부탁드립니다.
namespace WPF_ParsingXML.View.Templates
{
public class ProgressTemplateSelector : DataTemplateSelector
{
public DataTemplate WaitingTemplate
{ get; set; }
public DataTemplate ProgressTemplate
{ get; set; }
public DataTemplate CompleteTemplate
{ get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
File file= item as File;
if (file!= null)
{
if (file.StatusFilesize == 0)
{
return WaitingTemplate;
}
if (file.StatusFilesize == 100)
{
return CompleteTemplate;
}
return ProgressTemplate;
}
else
return base.SelectTemplate(item, container);
}
}
}
<UserControl x:Class="WPF_ParsingXML.View.FileSubPages.UserControls.SelectedFileListup"
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:WPF_ParsingXML.View.FileSubPages.UserControls"
xmlns:temp="clr-namespace:WPF_ParsingXML.View.Templates"
mc:Ignorable="d"
d:DesignHeight="450"
d:DesignWidth="500">
<UserControl.Resources>
<DataTemplate x:Key="WaitingTemplate">
<TextBlock Margin="2"
Text="Waiting"
Foreground="Green" />
</DataTemplate>
<DataTemplate x:Key="ProgressTemplate">
<Grid Width="200"
Margin="3">
<ProgressBar VerticalAlignment="Center"
Height="20"
Minimum="0"
Maximum="100"
Value="{Binding StatusFilesize}" />
<TextBlock Text="{Binding StatusFilesize,StringFormat={}{0:0}%}"
VerticalAlignment="Center"
HorizontalAlignment="Center" />
</Grid>
</DataTemplate>
<DataTemplate x:Key="CompleteTemplate">
<TextBlock Margin="2"
Text="Completed"
Foreground="Green" />
</DataTemplate>
</UserControl.Resources>
<DataGrid Name="fileList1"
ItemsSource="{Binding Selectedfiles}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
AutoGenerateColumns="False"
IsReadOnly="True"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<DataGrid.Columns>
<DataGridTextColumn Header="FileName"
Binding="{Binding FileName}"
Width="1*" />
<DataGridTextColumn Header="Modified Date"
Binding="{Binding Modified}"
Width="1*" />
<DataGridTextColumn Header="Origin Uri"
Binding="{Binding OriginUri}"
Width="1*" />
<DataGridTextColumn Header="Size"
Binding="{Binding Size, StringFormat={}{0:n1} MB}"
Width="1*" />
<DataGridTemplateColumn Header="Status"
Width="2*">
<DataGridTemplateColumn.CellTemplateSelector>
<temp:ProgressTemplateSelector CompleteTemplate="{StaticResource CompleteTemplate}"
ProgressTemplate="{StaticResource ProgressTemplate}"
WaitingTemplate="{StaticResource WaitingTemplate}" />
</DataGridTemplateColumn.CellTemplateSelector>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</UserControl>
namespace WPF_ParsingXML.Models
{
public class File: INotifyPropertyChanged, ISelectable
{
public string FileName { get; set; }
public string Modified { get; set; }
public string OriginUri { get; set; }
public string Size { get; set; } //Double
private int statusFilesize;
public int StatusFilesize
{
get { return statusFilesize; }
set
{
statusFilesize = value;
this.OnPropertyChanged(nameof(StatusFilesize));
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
읽어주셔서 감사합니다.