1

第一篇文章,所以请放轻松。我正在尝试从另一个页面获取复选框的值(这是 WPF 项目中导航表单的一部分),但是一旦页面发生更改,它总是将值重置为 false。如何让 IsChecked 值正确绑定?我正在学习刚刚开始使用 WPF,所以模板非常基础,如果有更好的方法可以做到这一点,那么我愿意接受。

如果要发挥作用,页面后面的代码也是 vb.net 而不是 c#。

样式调用如下:

<CheckBox Content="Photo" x:Name="OT_Photo" Grid.Row="0" Grid.Column="0" Style="{StaticResource ElementCheckbox}" />

这些页面上有数百个复选框,所以我非常希望避免每个页面都有变量。

样式在“Application.xaml”中

<Style TargetType="CheckBox" x:Key="ElementCheckbox">
        <Setter Property="IsThreeState" Value="True" />
        <Setter Property="IsChecked" Value="{Binding IsChecked ,Mode=TwoWay}"  /> 
        <Setter Property="Foreground" Value="Navy" />
        <Setter Property="FontSize" Value="14" />
        <Setter Property="Margin" Value="15,4,0,4" />
        <Setter Property="HorizontalAlignment" Value="Left" />
        <Setter Property="MaxWidth" Value="500" />
        <Setter Property="Template">
              <Setter.Value>
                <ControlTemplate TargetType="{x:Type CheckBox}">
                    <DockPanel DockPanel.Dock="Left">
                        <Border x:Name="Border" CornerRadius="0" VerticalAlignment="Top">
                            <Image Height="20" Width="20" Name="CheckMark" />
                        </Border>
                        <TextBlock x:Name="CheckText" Text="{TemplateBinding Content}" Margin="5,0,0,0" FontSize="{TemplateBinding FontSize}" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Top" />
                    </DockPanel>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="{x:Null}">
                            <Setter TargetName="CheckMark" Property="Source" Value="CheckBoxNull.png" />
                        </Trigger>
                        <Trigger Property="IsChecked" Value="false">
                            <Setter TargetName="CheckMark" Property="Source" Value="CheckBoxCross.png" />
                        </Trigger>
                        <Trigger Property="IsChecked" Value="true">
                            <Setter TargetName="CheckMark" Property="Source" Value="CheckBoxTick.png" />
                        </Trigger>
                         <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Effect" TargetName="Border">
                                <Setter.Value>
                                    <DropShadowEffect ShadowDepth="1" Color="Blue" Opacity="1" BlurRadius="2"/>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="Foreground" Value="Blue" TargetName="CheckText" />
                        </Trigger>
                          </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

在此先感谢您的帮助!

我应该补充一下,我已经坚持了一天多,我已经尝试了模板绑定、绑定路径和基于我已经找到的 c# 答案的点击过程。总是导致复选框被重置。

4

2 回答 2

1

解决了

我的问题与发生的复选框无关,该页面未静态命名,因此属性始终提供默认值。(菜鸟的错误——太丢人了)

从好的方面来说,如果有人想捏它,上面的代码可以完美地工作(以有限的方式)!

VB.NET:

Private Sub MainForm_Loaded(sender As Object, e As RoutedEventArgs) Handles MainForm.Loaded
    Me.NavigationService.Navigate(ContactDetailsPage)
End Sub

而不是 XAML 说明来源:

<NavigationWindow x:Name="MainForm" x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="" Source="ContactDetails.xaml">

于 2014-08-21T16:27:22.930 回答
0

我认为问题在于您在模板中定义绑定而不是在您的控件中。您通常不会在模板中进行绑定,除非它是 DataTemplate。

<CheckBox IsChecked="{Binding Value}" Content="Photo" x:Name="OT_Photo" Grid.Row="0" Grid.Column="0" Style="{StaticResource ElementCheckbox}" />

不要忘记为您的对象设置 de DataContext。

您可能想先测试绑定而不使用模板。如果这不能解决您的问题,那么发布代码隐藏也可能很有用。

于 2014-08-21T13:17:46.923 回答