Мультиконвертер WPF не вызывается для текстовой команды - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть пользовательский интерфейс WPF, как показано ниже. У него есть комбинированный список, содержащий все элементы, каждый элемент содержит 2 сегмента. Представления сегментов размещаются на разных элементах управления контентом. Каждое представление сегмента имеет флажок для включения / отключения содержимого всего сегмента.

myпривязка в сегментном представлении

<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 с одной привязкой к текущему текстовому полю и другой привязкой к упомянутому флажку. Однако параметр, переданный в вызванный метод, имеет только начальный статус первого элемента в выпадающем списке (хотя содержимое TextBox обновлено). Позже я добавляю Debugger.Break () к своему конвертеру в режиме отладки и обнаружил, что конвертер был вызван только один раз во время инициализации представления.

Если мой конвертер был вызван только один раз, почемуЯ получаю актуальное содержимое связанного текстового поля в методе invoke?

Если он вызывается каждый раз, почему код не останавливается в режиме отладки преобразователя?

Что происходити как это исправить? Спасибо всем большое.

P / s: Я заранее извиняюсь, потому что английский не моя мать. Если вам нужна дополнительная информация, пожалуйста, спросите.

1 Ответ

0 голосов
/ 30 сентября 2019

Похоже, это связано с тем, что вы привязываетесь к самому элементу управления CheckBox (который не "изменяется", кроме случаев, когда он загружается при инициализации), а не к его свойству IsChecked.

Выполняет что-то вроде следующей работы (Примечание: вам придется изменить ваш конвертер, так как он будет получать значение типа bool, в отличие от типа CheckBox):

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