【问题标题】:WPF multi converter is not called for textchanged command不为 textchanged 命令调用 WPF 多转换器
【发布时间】:2020-01-29 12:54:56
【问题描述】:

我有一个如下所示的 WPF UI。它有一个包含所有项目的组合框,每个项目包含 2 个段。段视图放置在不同的内容控件上。每个段视图都有一个复选框来启用/禁用整个段的内容。

我在段视图中的绑定

<TextBox Grid.Row="0" Grid.Column="1" Name="leftDistanceTextBox" 
                     Text="{Binding LeftDistance, UpdateSourceTrigger=PropertyChanged}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="TextChanged">
                        <i:InvokeCommandAction Command="{Binding DistanceChangedCommand}">
                            <i:InvokeCommandAction.CommandParameter>
                                <MultiBinding Converter="{StaticResource BeamIntersectionMultiConverter}" ConverterParameter="true">
                                    <Binding ElementName="leftDistanceTextBox"/>
                                    <Binding ElementName="enabledCheckBox"/>
                                </MultiBinding>
                            </i:InvokeCommandAction.CommandParameter>
                        </i:InvokeCommandAction>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TextBox>

我的转换器

 public class BeamIntersectionParamMultiConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            // it never stops here in debug mode, except the initializtion
            Debugger.Break();
            if (Validate(values, parameter))
            {
                TextBox control = values[0] as TextBox;

                CheckBox activation = values[1] as CheckBox;
                bool isEnabled = activation.IsChecked == true ? true : false;

                string text = (string)parameter;
                bool.TryParse(text, out bool isLeft);

                return new BeamIntersectionParam(control, isEnabled, isLeft);
            }
            return null;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            return null;
        }


问题在于:我想通过 interation.Command 验证/更新视图模型。 该命令有一个 MultiBindnig,其中一个绑定到当前文本框,另一个绑定到提到的 CheckBox。 但是,传递给被调用方法的参数仅具有组合框中第一项的初始状态(尽管 TextBox 的内容是最新的)。 后来,我在调试模式下将 Debugger.Break() 添加到我的转换器中,发现在视图初始化期间只调用了一次转换器。

如果我的转换器只被调用一次,为什么我会在调用方法中获取绑定文本框的最新内容?

如果每次都调用,为什么代码在converter indebug模式内不停止?

发生了什么以及如何解决?非常感谢大家。

P/s:我很抱歉,因为英语不是我的母语。如果您需要更多信息,请询问。

【问题讨论】:

    标签: c# wpf converters


    【解决方案1】:

    看起来这是因为您绑定到 CheckBox 控件本身(它不会“改变”,除非它在初始化时加载),而不是它的 IsChecked 属性。

    执行以下工作(注意:您必须更改转换器,因为它将接收bool 类型的值,而不是CheckBox 类型):

    <Binding ElementName="leftDistanceTextBox"/>
    <Binding Path="IsChecked", ElementName="enabledCheckBox" />
    <Binding Path="Text", ElementName="leftDistanceTextBox"/>
    

    【讨论】:

    • 嗯,我试过你的建议,但它不起作用。此外,我觉得这很奇怪,因为绑定适用于 TextBox 和其他一些控件,甚至是我其他项目中的 CheckBox。您对控件本身没有改变是正确的,但它的内容/值......确实会改变。由于我绑定到控件,因此我可以通过控件访问内容/值...。或者至少这是我迄今为止的想法和经历。
    • 我现在明白了一点,但我想知道 CommandParameter 是否在控件加载时预先计算。也许您可以尝试添加&lt;Binding Path="Text", ElementName="leftDistanceTextBox"/&gt; 看看是否会改变事情。这必须是对原始TextBox 的附加绑定,因为您需要控件来创建实际参数。我已经更新了我的答案以显示这会是什么样子。
    • 好吧,它的工作原理和以前一样,所以我会说我没有绑定到 TextBox,而是绑定到“Text Property”。但是,我想对 Control 做一些事情,因此我宁愿坚持使用原始绑定,以便可以通过参数转换器检索 TextBox。关于命令参数,我相信它是在调用命令时计算的——也就是路由的“TextChanged 事件”发生时。非常感谢任何进一步的文档/信息。
    • 如果您的转换器只被调用一次,我认为这表明该参数只计算一次,除非绑定的值发生变化。当命令被触发时,您是否看到它再次被调用?我建议绑定到TextBoxText 属性,就像我的回答一样,所以你仍然可以访问转换器中的控件。我还想知道您是否需要在Text 绑定中添加UpdateSourceTrigger="PropertyChanged"
    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多