수색…
매개 변수
매개 변수 | 세부 |
---|---|
값 | 바인딩 소스에서 생성 된 값입니다. |
값 | 바인딩 소스에 의해 생성 된 values 배열입니다. |
targetType | 바인딩 대상 속성의 유형입니다. |
매개 변수 | 사용할 변환기 매개 변수입니다. |
문화 | 변환기에서 사용할 문화권. |
비고
IValueConverter와 IMultiValueConverter는 무엇입니까?
IValueConverter 및 IMultiValueConverter - 바인딩에 사용자 지정 논리를 적용하는 방법을 제공하는 인터페이스입니다.
그 (것)들이 유용한 무엇을 위해
- 당신은 어떤 타입의 값을 가지고 있지만 한 가지 방법으로 0 값을 보여주고 다른 방식으로 양수를 보여주고 싶습니다.
- 어떤 유형의 가치가 있고 한 경우에는 요소를 표시하고 다른 경우에는 숨기기를 원합니다.
- 숫자 값을 가지고 있지만 단어로 표시하고 싶습니다.
- 숫자 값을 가지고 있지만 다른 숫자의 이미지를 보여주고 싶습니다.
이것들은 단순한 경우이지만 더 많은 것들이 있습니다.
이런 경우 값 변환기를 사용할 수 있습니다. IValueConverter 인터페이스 또는 IMultiValueConverter를 구현하는이 작은 클래스는 중간 인처럼 행동하고 소스와 대상 사이의 값을 변환합니다. 따라서 대상에 도달하기 전에 값을 변환하거나 소스로 다시 변환해야하는 상황에서는 변환기가 필요할 것입니다.
빌드 - 인 BooleanToVisibilityConverter [IValueConverter]
부울과 가시성 사이의 변환기. 입력 값에 bool
값을 가져와 Visibility
값을 반환합니다.
참고 :이 변환기는 이미 System.Windows.Controls
네임 스페이스에 있습니다.
public sealed class BooleanToVisibilityConverter : IValueConverter
{
/// <summary>
/// Convert bool or Nullable bool to Visibility
/// </summary>
/// <param name="value">bool or Nullable bool</param>
/// <param name="targetType">Visibility</param>
/// <param name="parameter">null</param>
/// <param name="culture">null</param>
/// <returns>Visible or Collapsed</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool bValue = false;
if (value is bool)
{
bValue = (bool)value;
}
else if (value is Nullable<bool>)
{
Nullable<bool> tmp = (Nullable<bool>)value;
bValue = tmp.HasValue ? tmp.Value : false;
}
return (bValue) ? Visibility.Visible : Visibility.Collapsed;
}
/// <summary>
/// Convert Visibility to boolean
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
return (Visibility)value == Visibility.Visible;
}
else
{
return false;
}
}
}
변환기 사용
- 리소스 정의
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
- 바인딩에 사용하십시오.
<Button Visibility="{Binding AllowEditing,
Converter={StaticResource BooleanToVisibilityConverter}}"/>
속성이있는 변환기 [IValueConverter]
속성을 통해 매개 변수가있는 간단한 변환기를 만든 다음이를 선언에 전달하는 방법을 보여줍니다. bool
값을 Visibility
변환합니다. Inverted
속성을 True
로 설정하여 결과 값을 반전시킵니다.
public class BooleanToVisibilityConverter : IValueConverter
{
public bool Inverted { get; set; }
/// <summary>
/// Convert bool or Nullable bool to Visibility
/// </summary>
/// <param name="value">bool or Nullable bool</param>
/// <param name="targetType">Visibility</param>
/// <param name="parameter">null</param>
/// <param name="culture">null</param>
/// <returns>Visible or Collapsed</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool bValue = false;
if (value is bool)
{
bValue = (bool)value;
}
else if (value is Nullable<bool>)
{
Nullable<bool> tmp = (Nullable<bool>)value;
bValue = tmp ?? false;
}
if (Inverted)
bValue = !bValue;
return (bValue) ? Visibility.Visible : Visibility.Collapsed;
}
/// <summary>
/// Convert Visibility to boolean
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns>True or False</returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
return ((Visibility) value == Visibility.Visible) && !Inverted;
}
return false;
}
}
변환기 사용
- 네임 스페이스 정의
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
- 리소스 정의
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityInvertedConverter"
Inverted="False"/>
- 바인딩에 사용하십시오.
<Button Visibility="{Binding AllowEditing, Converter={StaticResource BoolToVisibilityConverter}}"/>
단순한 추가 변환기 [IMultiValueConverter]
간단한 IMultiValueConverter
변환기를 만들고 xaml에서 MultiBinding
을 사용하는 방법을 보여줍니다. values
배열에 의해 전달 된 모든 값의 합계를 구합니다.
public class AddConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
decimal sum = 0M;
foreach (string value in values)
{
decimal parseResult;
if (decimal.TryParse(value, out parseResult))
{
sum += parseResult;
}
}
return sum.ToString(culture);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
변환기 사용
- 네임 스페이스 정의
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
- 리소스 정의
<converters:AddConverter x:Key="AddConverter"/>
- 바인딩에 사용하십시오.
<StackPanel Orientation="Vertical">
<TextBox x:Name="TextBox" />
<TextBox x:Name="TextBox1" />
<TextBlock >
<TextBlock.Text>
<MultiBinding Converter="{StaticResource AddConverter}">
<Binding Path="Text" ElementName="TextBox"/>
<Binding Path="Text" ElementName="TextBox1"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
ConverterParameter를 사용하는 사용 변환기
간단한 변환기를 만들고 ConverterParameter
를 사용하여 ConverterParameter
에 매개 변수를 전달하는 방법을 보여줍니다. ConverterParameter에서 전달 된 계수로 값에 곱합니다.
public class MultiplyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return 0;
if (parameter == null)
parameter = 1;
double number;
double coefficient;
if (double.TryParse(value.ToString(), out number) && double.TryParse(parameter.ToString(), out coefficient))
{
return number * coefficient;
}
return 0;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
변환기 사용
- 네임 스페이스 정의
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
- 리소스 정의
<converters:MultiplyConverter x:Key="MultiplyConverter"/>
- 바인딩에 사용하십시오.
<StackPanel Orientation="Vertical">
<TextBox x:Name="TextBox" />
<TextBlock Text="{Binding Path=Text,
ElementName=TextBox,
Converter={StaticResource MultiplyConverter},
ConverterParameter=10}"/>
</StackPanel>
여러 개의 변환기 그룹화 [IValueConverter]
이 컨버터는 여러 컨버터를 함께 연결합니다.
public class ValueConverterGroup : List<IValueConverter>, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
이 예제에서는 EnumToBooleanConverter
의 부울 결과가 BooleanToVisibilityConverter
입력으로 사용됩니다.
<local:ValueConverterGroup x:Key="EnumToVisibilityConverter">
<local:EnumToBooleanConverter/>
<local:BooleanToVisibilityConverter/>
</local:ValueConverterGroup>
이 버튼은 CurrentMode
속성이 Ready
로 설정된 경우에만 표시됩니다.
<Button Content="Ok" Visibility="{Binding Path=CurrentMode, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static local:Mode.Ready}"/>
변환기와 함께 MarkupExtension을 사용하여 소스 선언을 건너 뜁니다.
일반적으로 변환기를 사용하려면 다음과 같이 자원을 정의해야합니다.
<converters:SomeConverter x:Key="SomeConverter"/>
변환기를 MarkupExtension
으로 정의하고 ProvideValue
메서드를 구현하여이 단계를 건너 뛸 수 있습니다. 다음 예제에서는 값을 음수로 변환합니다.
namespace MyProject.Converters
{
public class Converter_Negative : MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return this.ReturnNegative(value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return this.ReturnNegative(value);
}
private object ReturnNegative(object value)
{
object result = null;
var @switch = new Dictionary<Type, Action> {
{ typeof(bool), () => result=!(bool)value },
{ typeof(byte), () => result=-1*(byte)value },
{ typeof(short), () => result=-1*(short)value },
{ typeof(int), () => result=-1*(int)value },
{ typeof(long), () => result=-1*(long)value },
{ typeof(float), () => result=-1f*(float)value },
{ typeof(double), () => result=-1d*(double)value },
{ typeof(decimal), () => result=-1m*(decimal)value }
};
@switch[value.GetType()]();
if (result == null) throw new NotImplementedException();
return result;
}
public Converter_Negative()
: base()
{
}
private static Converter_Negative _converter = null;
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_converter == null) _converter = new Converter_Negative();
return _converter;
}
}
}
변환기 사용 :
네임 스페이스 정의
xmlns : converters = "clr-namespace : MyProject.Converters; assembly = MyProject"
바인딩에서이 변환기의 예제 사용
<RichTextBox IsReadOnly="{Binding Path=IsChecked, ElementName=toggleIsEnabled, Converter={converters:Converter_Negative}}"/>
IMultiValueConverter를 사용하여 여러 매개 변수를 명령에 전달
매우 간단한 IMultiValueConverter
사용하여 MultiBinding
을 사용하여 CommandParameter
로 여러 바인딩 된 값을 전달할 수 있습니다.
namespace MyProject.Converters
{
public class Converter_MultipleCommandParameters : MarkupExtension, IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.ToArray();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
private static Converter_MultipleCommandParameters _converter = null;
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_converter == null) _converter = new Converter_MultipleCommandParameters();
return _converter;
}
public Converter_MultipleCommandParameters()
: base()
{
}
}
}
변환기 사용 :
구현 예 -
SomeCommand
가 실행될 때 호출되는SomeCommand
입니다 ( 참고 :DelegateCommand
는이 예에서는 제공되지 않는ICommand
구현 임 ).private ICommand _SomeCommand; public ICommand SomeCommand { get { return _SomeCommand ?? (_SomeCommand = new DelegateCommand(a => OnSomeCommand(a))); } } private void OnSomeCommand(object item) { object[] parameters = item as object[]; MessageBox.Show( string.Format("Execute command: {0}\nParameter 1: {1}\nParamter 2: {2}\nParamter 3: {3}", "SomeCommand", parameters[0], parameters[1], parameters[2])); }
네임 스페이스 정의
xmlns : converters = "clr-namespace : MyProject.Converters; assembly = MyProject"
바인딩에서이 변환기의 예제 사용
<Button Width="150" Height="23" Content="Execute some command" Name="btnTestSomeCommand" Command="{Binding Path=SomeCommand}" > <Button.CommandParameter> <MultiBinding Converter="{converters:Converter_MultipleCommandParameters}"> <Binding RelativeSource="{RelativeSource Self}" Path="IsFocused"/> <Binding RelativeSource="{RelativeSource Self}" Path="Name"/> <Binding RelativeSource="{RelativeSource Self}" Path="ActualWidth"/> </MultiBinding> </Button.CommandParameter> </Button>