2014-10-13 2 views
2

XAML призывает установить на предшествующее связывание со значением нового связыванияXAML звонит получить с до связывания

стека вызовов

Gabe2a.exe!Gabe2a.GabeLib.SearchItem.ParenRight1.set(bool value) Line 24333 C# 
[External Code] 
Gabe2a.exe!Gabe2a.PageSearch.NotifyPropertyChanged(string info) Line 34 C# 

searchItemCur правильно

protected void NotifyPropertyChanged(String info) 
{ 
    if (PropertyChanged != null) 
    { 
     Debug.WriteLine("PageSearch NotifyPropertyChanged " + info); 
     if (info == "SearchItemCur" && searchItemCur != null) 
      Debug.WriteLine(" searchItemCur " + searchItemCur.FieldDef.DispName); 
     PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 
} 

Ниже вызывается в неправильном объекте
Определенное поле FieldDef.DispName ошибочно
Он вызывается на th е старое связывание с новым значением

public Boolean ParenRight3 
{ 
    get { return parenRight3; } 
    set 
    { 
     if (parenRight3 == value) return; 
     Debug.WriteLine("ParenRight3 " + value.ToString() + " " + FieldDef.DispName); 
     if (value && (AndOr == enumAndOr.Except || AndOr == enumAndOr.NotYetDefined)) return; 
     parenRight3 = value; 

Я проследил его вниз
Он разбивает на [Код внешнего], который я уверен, это XAML
Эта линия звонит старый связыванию со значением нового связывание
Присвоить значение нового связывания с обязательными результатами в неверном значении
Если старая и новая оба имеют одинаковое значение, то нет никакого вызова, чтобы получить на всех

Gabe2a.exe!Gabe2a.GabeLib.SearchItem.ParenRight1.set(bool value) Line 24333 C# 
[External Code] 
Gabe2a.exe!Gabe2a.PageSearch.NotifyPropertyChanged(string info) Line 34 C# 

Это связывание

<RadioButton Style="{StaticResource RadioButton03}" FontSize="14" Content=")" 
      IsChecked="{Binding ElementName=_this, Path=SearchItemCur.ParenRight1}"/> 

Существует отдельный DataContext

+0

Радиокнопки и привязки могут взаимодействовать смешными способами из-за того, что измененный IsChecked на переключателе также неявно изменяет его на других переключателях в той же группе. Когда это изменение происходит в результате изменения привязки, вы можете завершить работу в ситуациях, когда IsChecked изменяется из-за привязки, которая меняет IsChecked на другом переключателе, который затем модифицирует «старый» объект, поскольку изменение привязки hasn ' t полностью размножается. –

+0

@DanBryant Странно, что другой RadioButton работает. И он всегда отправляет значение новой привязки, даже если значение истинно. Но что-то обдумать. – Paparazzi

+0

@ DanBryant Nice catch. Я изменил их на CheckBoxes, и проблема, похоже, исчезла. Человек я боролся с этим в течение 4 часов. – Paparazzi

ответ

2

Как уже говорилось в комментарии, радио-кнопки и привязок взаимодействуют в некоторых забавных способов, благодаря автоматической настройке IsChecked на других переключателей в результате взаимодействия внутри группы. Я столкнулся с этим, когда имел дело с переключателями в качестве части шаблона данных. Когда вы меняете DataContext, он будет повторно использовать визуальное дерево, созданное для шаблона, но затем распространять измененный DataContext на все переключатели внутри. Это приводит к тому же результату, который вы наблюдали с вложенным путем в привязке.

Вот стиль флажка, который был переделан, чтобы выглядеть как кнопка радио. Это не хватает нескольких ресурсов стиля, но вы можете немного взломать его для работы с любыми стилями, которые использует ваше приложение. Обратите внимание на взломанный «IsHitTestVisible»; это используется, чтобы пользователь не мог снять флажок, который должен действовать как переключатель.

<Style x:Key="RadioCheckBox" TargetType="{x:Type CheckBox}"> 
    <Setter Property="SnapsToDevicePixels" Value="true" /> 
    <Setter Property="FocusVisualStyle" Value="{DynamicResource RadioButtonFocusVisual}" /> 
    <Setter Property="Background" Value="{DynamicResource CheckBoxBg}" /> 
    <Setter Property="BorderBrush" Value="{DynamicResource NormalBorderBrush}" /> 
    <Setter Property="Template" Value="{DynamicResource NuclearRadioCheckBox}" /> 
    <Setter Property="IsHitTestVisible" Value="{Binding IsChecked, RelativeSource={RelativeSource Self}, Converter={StaticResource InvBool}}"/> 
</Style> 

<ControlTemplate x:Key="NuclearRadioCheckBox" TargetType="{x:Type CheckBox}"> 
    <BulletDecorator Background="Transparent"> 
     <BulletDecorator.Bullet> 
      <Grid Width="13" Height="13"> 
       <Ellipse x:Name="Ellipse_Border" Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="1" /> 
       <Ellipse x:Name="InnerBorder" StrokeThickness="1" Stroke="{DynamicResource CheckBoxInnerBorderBrush}" Margin="2" /> 
       <Ellipse Margin="3" x:Name="CheckMark" Stroke="#FFAA5B0B"> 
        <Ellipse.Fill> 
         <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
          <GradientStop Color="#FFFFFFAF" Offset="0" /> 
          <GradientStop Color="#FFFE9E45" Offset="1" /> 
          <GradientStop Color="#FFFFE38A" Offset="0.325" /> 
          <GradientStop Color="#FFFFBA61" Offset="0.663" /> 
         </LinearGradientBrush> 
        </Ellipse.Fill> 
       </Ellipse> 
      </Grid> 
     </BulletDecorator.Bullet> 
     <ContentPresenter RecognizesAccessKey="True" Margin="5,0,0,0" HorizontalAlignment="Left" /> 
    </BulletDecorator> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsChecked" Value="false"> 
      <Setter Property="Visibility" Value="Collapsed" TargetName="CheckMark" /> 
     </Trigger> 
     <Trigger Property="IsMouseOver" Value="true"> 
      <Setter Property="Fill" Value="{DynamicResource MouseOverBrush}" TargetName="Ellipse_Border" /> 
      <Setter Property="Stroke" TargetName="InnerBorder" Value="{DynamicResource CheckBoxInnerBorderHoverBrush}" /> 
      <Setter Property="Stroke" TargetName="Ellipse_Border" Value="{DynamicResource CheckBoxHoverBorderBrush}" /> 
     </Trigger> 
     <Trigger Property="IsPressed" Value="true"> 
      <Setter Property="Fill" Value="{DynamicResource PressedBrush}" TargetName="Ellipse_Border" /> 
      <Setter Property="Stroke" Value="{DynamicResource GlyphBrush}" TargetName="Ellipse_Border" /> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Fill" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Ellipse_Border" /> 
      <Setter Property="Stroke" Value="#40000000" TargetName="Ellipse_Border" /> 
      <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}" /> 
     </Trigger> 

    </ControlTemplate.Triggers> 
</ControlTemplate> 
Смежные вопросы