2013-08-21 2 views
0

У меня есть этот код в 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

ответ

0

Вы можете связать только Yes радио. Поскольку свойство IsChecked связано с вашим bool, bool превратится в false, когда вы проверите другое радио. Вам даже не нужен ReverseConverter.

UPDATE:
только привязать Yes радио к вашей области. RadioButton являются взаимоисключающими, когда они находятся в одной и той же группе (какие они). Когда вы выберете один, вы измените другой. Если вы выберете радио No, да будет снято, и поэтому Required будет false.

Что касается начальных значений, если вы установили No в значение false, оно будет выбрано. А так как Yes привязан к Required, это сэкономит ваше значение. Сделайте что-то вроде этого:

<RadioButton Content="Yes" GroupName="GRequired" IsChecked="{Binding Required}"/> 
<RadioButton Content="No" GroupName="GRequired" IsChecked="False"/> 

UPDATE II:
Связующий механизм в WPF связывает два значения вместе, поэтому, когда один изменяет другой делает тоже самое, и он может работать в обоих направлениях. RadioButton.IsCheck - это просто свойство bool, поэтому при изменении значения оно меняет значение, на которое оно связано (в данном случае Required). Когда вы проверите No, вы также снимите отметку Yes, это IsChecked изменений свойств. и что изменяется Required.
Подробнее о привязке данных см.: http://msdn.microsoft.com/en-us/library/ms752347.aspx.

Итак, вы не нуждаетесь в ReverseConverter, потому что вам не нужно связывать No с чем угодно. На самом деле вам даже не нужно NullBooleanConverter, так как WPF уже знает, как конвертировать bool? в bool.

С уважением,
Йони

+0

Как бы кнопка Нет никогда не выбрано, если нет преобразователя не связан с этой кнопкой радио? Say значение для Да не выбрано, как бы Нет выбрана в этой ситуации? – user2358826

+0

Я сделал следующее и теперь .. , и теперь, когда я добавляю форму, по умолчанию выбрано No, но момент – user2358826

+0

Я выбрал yes или no или сохранил форму, как радио выбор кнопки исчезает, и я никогда не могу выбрать их снова, попробуйте столько, конвертер вернет его, чтобы отменить выбор для «Да» или «Нет». Также добавление «Добавление нового» не приводит к сбою приложения, но, похоже, не добавляет новую форму. Оцените свои быстрые ответы, которые вы дали для предложений. Спасибо Dhiren – user2358826

 Смежные вопросы

  • Нет связанных вопросов^_^