У меня есть этот код в WPF Каждая новая форма добавляется, нажимая «Добавить новое» в Itemscontrol.Избегайте бесконечного цикла в ItemsControl, имеющем значение радиоблока, заданное преобразователями
Событие - вызов CSLA.
<Menu Grid.Row="0">
<MenuItem Header="Add New"
csla:InvokeMethod.MethodName="AddNew"
csla:InvokeMethod.TriggerEvent="Click" />
</Menu></ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate >
<DataTemplate.Resources>
<FrameworkElement x:Key="ReqProxyElement" DataContext="{Binding}" />
</DataTemplate.Resources>
<Grid>
<ContentControl Visibility="Collapsed" Content="{StaticResource ReqProxyElement}" />
<Grid>
<Grid.DataContext>
<formviewmodels:ReqViewModel Model="{Binding Source={StaticResource ReqProxyElement}, Path=DataContext}" />
</Grid.DataContext>
<formviews:ReqView />
</Grid>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Теперь в форме ReqView, у меня есть конвертер для переключателя.
<Label Grid.Row="10" Grid.Column="0" Content="required" />
<StackPanel Orientation="Horizontal" Grid.Row="10" Grid.Column="1" >
<!--<RadioButton Content="Yes" GroupName="Required" IsChecked="{Binding Model.Required, Converter={StaticResource NullableBooleanToFalseConverter}}"></RadioButton>
<RadioButton Content="No" GroupName="Required" IsChecked="{Binding Model.Required, Converter={StaticResource ReverseBoolean}}"></RadioButton>-->
<RadioButton Content="Yes" GroupName="GRequired" ></RadioButton>
<RadioButton Content="No" GroupName="GRequired" ></RadioButton>
</StackPanel>
В этом случае при нажатии кнопки на добавление, в ItemsControl, как природа зверя пытается связать обратно в форму и переходит в бесконечный цикл в преобразовательной вызова. Код преобразователя приведен ниже.
public class ReverseBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
return (!((bool)value));
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
return (!((bool)value));
}
return value;
}
}
public class NullableBooleanToFalseConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return false;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
Может ли кто-нибудь придумать решение, в котором конвертер не будет вводить код в бесконечный цикл. Что происходит, когда нажата кнопка «Добавить новое», если в Itemscontrol уже есть форма, она пытается связать обратно форму, прежде чем создавать новую пустую форму. Возврат привязки устанавливает правка true, если выбрано значение true, но затем установка на trus начинается теннисный матч между двумя конвертерами, один из которых преобразует его, другой конвертирует его обратно, и модель говорит, что значение не истинно и так далее. до тех пор, пока приложение не попадет в stackoverflow ...
Интересная ситуация, с которой я столкнулся с шаблонами WPF и MVVM. Я ищу решение, не нарушая парадигму MVVM. Если конвертеры могут быть устранены, это тоже сработает. Бэкэнд-вызовы - это восстановленные свойства CSLA.
Благодаря Dhiren
Как бы кнопка Нет никогда не выбрано, если нет преобразователя не связан с этой кнопкой радио? Say значение для Да не выбрано, как бы Нет выбрана в этой ситуации? – user2358826
Я сделал следующее и теперь .. RadioButton> RadioButton> , и теперь, когда я добавляю форму, по умолчанию выбрано No, но момент –
user2358826
Я выбрал yes или no или сохранил форму, как радио выбор кнопки исчезает, и я никогда не могу выбрать их снова, попробуйте столько, конвертер вернет его, чтобы отменить выбор для «Да» или «Нет». Также добавление «Добавление нового» не приводит к сбою приложения, но, похоже, не добавляет новую форму. Оцените свои быстрые ответы, которые вы дали для предложений. Спасибо Dhiren – user2358826