【问题标题】:Decouple IValueConverter (Disable/Enable a WPF Converter)解耦 IValueConverter(禁用/启用 WPF 转换器)
【发布时间】:2021-10-11 09:35:54
【问题描述】:

这是一种启用和禁用 WPF 转换器的方法吗?以编程方式或直接从 WPF 将复选框控件绑定到它。

我的应用程序中有这个文本框和复选框:

当复选框未选中时,我可以输入任何数值,但当我选中复选框时,我想启用此转换器:

<TextBox
Grid.Row="1"
Grid.Column="1"
Margin="0,0,10,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
MaxLength="41"
Text="{
    Binding Payload, 
    Mode=TwoWay, 
    Converter={StaticResource HexStringConverter}, 
    UpdateSourceTrigger=PropertyChanged}" 
/>

另外,这是转换器类:

public class HexStringConverter : IValueConverter
    {
        private string lastValidValue;
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string ret = null;

            if (value != null && value is string)
            {
                var valueAsString = (string)value;
                var parts = valueAsString.ToCharArray();
                var formatted = parts.Select((p, i) => (++i) % 2 == 0 ? String.Concat(p.ToString(), " ") : p.ToString());
                ret = String.Join(String.Empty, formatted).Trim();
            }

            return ret;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            object ret = null;
            if (value != null && value is string)
            {
                var valueAsString = ((string)value).Replace(" ", String.Empty).ToUpper();
                ret = lastValidValue = IsHex(valueAsString) ? valueAsString : lastValidValue;
            }

            return ret;
        }


        private bool IsHex(string text)
        {
            var reg = new System.Text.RegularExpressions.Regex(@"^[0-9A-Fa-f\[\]]*$");
            return reg.IsMatch(text);
        }
    }

【问题讨论】:

    标签: c# wpf binding ivalueconverter


    【解决方案1】:

    在 WPF 中,有很多方法可以做到这一点。

    一种方法是使用触发器来更改为Text 提供的绑定,例如:

    <TextBlock ....>
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Setter Property="Text" Value="{Binding Payload}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsChecked, ElementName=NameOfCheckBox}" Value="True">
                        <Setter Property="Text"
                                Value="{Binding Payload, Converter={StaticResource HexToStringConverter}}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    

    另一种方法是使用IMultiValueConverter

    public class HexStringConverter : IMultiValueConverter
    {
        public object Convert (object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Length != 2 ||
                values[0] is not string str ||
                values[1] is not bool isEnabled)
            {
                return DependencyProperty.UnsetValue;
            }
     
            if (isEnabled)
            {
                // Do the actual conversion
            }
            else
            {
                return str;
            }
        }
    }
    

    然后:

    <TextBlock ...>
        <TextBlock.Text>
            <MultiBinding Converter="{StaticResource HexToStringConverter}">
                <Binding Path="Payload"/>
                <Binding Path="IsChecked" ElementName="NameOfCheckBox"/>
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
    

    【讨论】:

    • 太棒了!万分感谢!我会选择第一个选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多