[WPF] Popup, BindingGroup, Accept/Cancel
От: a-belich Россия  
Дата: 30.11.11 08:37
Оценка:
Всем доброго дня, взникла следующая проблема. Есть таблица со множеством ячеек, данные в каждой ячейке должны редактироваться во всплывающем окне, при этом результат редактирования должен быть подтвержден или отменен. Для этих целей есть контрол (схематично):

<ItemsControl>

 <ItemsControl.BindingGroup>
  <BindingGroup />
 </ItemsControl.BindingGroup>

 <ItemsControl.Template>
  <ControlTemplate>
   <StackPanel VerticalAlignment="Stretch">
     <ToggleButton x:Name="buttonShowPopup" Content="{Binding Path=Text, RelativeSource={RelativeSource TemplatedParent}}"
      IsChecked="{Binding Path=IsOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>

     <Popup x:Name="popup" PlacementTarget="{Binding ElementName=buttonShowPopup}" 
      IsOpen="{Binding Path=IsOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" 
      StaysOpen="true" MouseLeave="popup_MouseLeave">

      <Border BorderBrush="Black" BorderThickness="2" Padding="5">
       <StackPanel>
        <ItemsPresenter/>
        <StackPanel>
         <Button Height="25" Margin="1" Content="ОК" Name="btnOK" Click="btnOK_Click"/>
         <Button Height="25" Margin="1" Content="Отмена" Name="btnCancel" Click="btnCancel_Click"/>
        </StackPanel>
       </StackPanel>
      </Border>
    </Popup>
   </StackPanel>
  </ControlTemplate>
 </ItemsControl.Template>
</ItemsControl>



private void CancelEdit()
{
  IsOpen = false;

  BindingGroup.CancelEdit();
  BindingGroup.BeginEdit();
}

private void btnOK_Click(object sender, RoutedEventArgs e)
{
  IsOpen = false;

  BindingGroup.CommitEdit();
  BindingGroup.BeginEdit();
}

private void btnCancel_Click(object sender, RoutedEventArgs e)
{
  CancelEdit();
}


Используется он следующим образом:

<MyPopupControl Grid.Column="32"  Text="{Binding Path=Prop1, Converter={StaticResource enumToStringConverter}}">
 <RadioButton Content="Значение1" 
     IsChecked="{Binding Path=Prop1, Converter={StaticResource enumToBooleanConverter}, ConverterParameter=Value1}"/>
 <RadioButton Content="Значение1" 
     IsChecked="{Binding Path=Prop2, Converter={StaticResource enumToBooleanConverter}, ConverterParameter=Value2}"/>
</MyPopupControl>



При первом открытии попапа и сохранении/отмене результатов все работает, но при повторном открытии — изменения перестают сохраняться. Заметил, что при каждом открытии попапа исчезает один элемент в коллекции BbindingGroup.BindingExpressions. Подскажите в чем может быть проблема?
Re: [WPF] Popup, BindingGroup, Accept/Cancel
От: MxMsk Португалия  
Дата: 01.12.11 07:35
Оценка:
Здравствуйте, a-belich, Вы писали:

AB>При первом открытии попапа и сохранении/отмене результатов все работает, но при повторном открытии — изменения перестают сохраняться. Заметил, что при каждом открытии попапа исчезает один элемент в коллекции BbindingGroup.BindingExpressions. Подскажите в чем может быть проблема?

С BindingGroup не работал, но есть подозрение, что это известная трабла RadioButton, исправленная только в 4-й версии .Net Framework. В силу того, что привязка кладется, как локальное значение, присвоение IsChecked затирает ее. Таки образом, если с каждым показом, выбирать разные RadioButton, то потихоньку все Binding-и слетят. Ну, это так сказать, вольные суждения, с натяжечкой...
Re[2]: [WPF] Popup, BindingGroup, Accept/Cancel
От: a-belich Россия  
Дата: 01.12.11 10:47
Оценка:
Здравствуйте, MxMsk, Вы писали:

Такая ситуация повторяется не только с RadioButton, но и просто с текстовым полем на этом попапе.
Re[2]: [WPF] Popup, BindingGroup, Accept/Cancel
От: a-belich Россия  
Дата: 02.12.11 03:33
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, a-belich, Вы писали:


AB>>При первом открытии попапа и сохранении/отмене результатов все работает, но при повторном открытии — изменения перестают сохраняться. Заметил, что при каждом открытии попапа исчезает один элемент в коллекции BbindingGroup.BindingExpressions. Подскажите в чем может быть проблема?

MM>С BindingGroup не работал, но есть подозрение, что это известная трабла RadioButton, исправленная только в 4-й версии .Net Framework. В силу того, что привязка кладется, как локальное значение, присвоение IsChecked затирает ее. Таки образом, если с каждым показом, выбирать разные RadioButton, то потихоньку все Binding-и слетят. Ну, это так сказать, вольные суждения, с натяжечкой...

Перевел проект на .NET 4.0 — проблема осталась. Если убрать BindingGroup у контрола, то биндинги работают нормально.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.