이전(이 글)에 싱글톤 패턴으로 페이지의 인스턴스를 호출하여 x:Name을 통해 CheckBox의 내용을 가져오는 방식을 사용했었다. 아무리 싱글톤으로 만든 인스턴스라지만 자주 호출하는 것이 영 꺼림칙하여 Xceed Wpf ToolKit을 사용하지 않고 Converter를 작성하여 CheckBox에서 선택한 항목을 List로 만드는 방법으로 변경해보았다.
//CheckBox
public List<string> CheckedList { get; set; }
public class CheckBoxToListConverter : IValueConverter
{
List<string> bound = new List<string>();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (bound.Contains(parameter.ToString()))
{
return true;
}
else
{
return false;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
bool isChecked = (bool)value;
if (isChecked)
{
bound.Add(parameter.ToString());
}
else
{
bound.Remove(parameter.ToString());
}
return bound;
}
}
<CheckBox Content="A" IsChecked="{Binding CheckedList, Converter={StaticResource CheckBoxToListCV}, ConverterParameter='A'}"/>
<CheckBox Content="B" IsChecked="{Binding CheckedList, Converter={StaticResource CheckBoxToListCV}, ConverterParameter='B'}"/>
<CheckBox Content="C" IsChecked="{Binding CheckedList, Converter={StaticResource CheckBoxToListCV}, ConverterParameter='C'}"/>
<CheckBox Content="D" IsChecked="{Binding CheckedList, Converter={StaticResource CheckBoxToListCV}, ConverterParameter='D'}"/>
for (int i = 0; i < CheckedList.Count; i++)
{
Console.WriteLine(CheckedList[i]);
}
이전 코드를 활용하여 버튼을 누르면 콘솔에 출력되도록 작성해보았다.
Converter와 CommandParameter 등 이전보다 WPF에 대해 더 많이 알게 된 것 같은 기분이 드는 동시에...난 아직 스택오버플로우가 없으면 Converter 작성하기는 너무 어려운 것 같다. 😂