Dreamine.UI.Wpf 1.0.1
Dreamine.UI.Wpf 사용자 인터페이스 기능과 구성 요소를 제공합니다.
로딩중...
검색중...
일치하는것 없음
BoolToVisibilityConverter.cs
이 파일의 문서화 페이지로 가기
1using System;
2using System.Globalization;
3using System.Linq;
4using System.Windows;
5using System.Windows.Data;
6
8{
25 public sealed class BoolToVisibilityConverter : IValueConverter
26 {
35 public bool Inverse { get; set; } = false;
36
45 public bool UseHidden { get; set; } = false;
46
95 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
96 {
97 // \brief Read options from instance properties first.
98 bool inverse = Inverse;
99 bool useHidden = UseHidden;
100
101 // \brief Allow ConverterParameter to override / augment options.
102 ApplyOptionsFromParameter(parameter, ref inverse, ref useHidden);
103
104 // \brief Normalize input to bool.
105 bool val = ToBoolSafe(value);
106
107 if (inverse)
108 val = !val;
109
110 return val
111 ? Visibility.Visible
112 : (useHidden ? Visibility.Hidden : Visibility.Collapsed);
113 }
114
163 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
164 {
165 bool inverse = Inverse;
166 bool useHidden = UseHidden; // \brief Not used directly in ConvertBack, but parsed for symmetry.
167 ApplyOptionsFromParameter(parameter, ref inverse, ref useHidden);
168
169 Visibility vis = value is Visibility v ? v : Visibility.Collapsed;
170
171 bool result = (vis == Visibility.Visible);
172 return inverse ? !result : result;
173 }
174
199 private static bool ToBoolSafe(object? value)
200 {
201 if (value == null)
202 return false;
203
204 // \brief Direct bool (covers boxed bool)
205 if (value is bool b)
206 return b;
207
208 // \brief Nullable<bool> comes in boxed as bool when HasValue == true,
209 // so no separate "bool?" pattern is required.
210 // (This avoids CS8116 entirely.)
211
212 // \brief String handling
213 if (value is string s)
214 {
215 if (bool.TryParse(s, out bool parsedBool))
216 return parsedBool;
217
218 if (int.TryParse(s, NumberStyles.Integer, CultureInfo.InvariantCulture, out int parsedInt))
219 return parsedInt != 0;
220 }
221
222 // \brief Numeric handling
223 if (value is byte by) return by != 0;
224 if (value is short sh) return sh != 0;
225 if (value is int it) return it != 0;
226 if (value is long lo) return lo != 0;
227
228 // \brief Last-resort conversion
229 try
230 {
231 return System.Convert.ToBoolean(value, CultureInfo.InvariantCulture);
232 }
233 catch
234 {
235 return false;
236 }
237 }
238
239
272 private static void ApplyOptionsFromParameter(object parameter, ref bool inverse, ref bool useHidden)
273 {
274 if (parameter == null)
275 return;
276
277 // \brief bool parameter: treat as inverse override.
278 if (parameter is bool b)
279 {
280 inverse = b;
281 return;
282 }
283
284 // \brief Visibility parameter: Hidden implies UseHidden.
285 if (parameter is Visibility vis)
286 {
287 useHidden = (vis == Visibility.Hidden);
288 return;
289 }
290
291 // \brief string parameter: parse tokens.
292 if (parameter is string s)
293 {
294 var tokens = s
295 .Split(new[] { ',', ';', '|', ' ' }, StringSplitOptions.RemoveEmptyEntries)
296 .Select(t => t.Trim())
297 .Where(t => !string.IsNullOrWhiteSpace(t))
298 .ToArray();
299
300 foreach (var token in tokens)
301 {
302 if (token.Equals("Inverse", StringComparison.OrdinalIgnoreCase))
303 inverse = true;
304
305 if (token.Equals("Hidden", StringComparison.OrdinalIgnoreCase) ||
306 token.Equals("UseHidden", StringComparison.OrdinalIgnoreCase))
307 useHidden = true;
308
309 if (token.Equals("Collapsed", StringComparison.OrdinalIgnoreCase))
310 useHidden = false;
311 }
312 }
313 }
314 }
315}
static void ApplyOptionsFromParameter(object parameter, ref bool inverse, ref bool useHidden)
object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
object Convert(object value, Type targetType, object parameter, CultureInfo culture)