wpf xaml复选框模板的风格

时间:2014-08-21 12:30:49

标签: wpf xaml checkbox binding ischecked

首先发布,请轻松一下。 我试图从另一个页面获取复选框的值(这是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#答案的点击程序。总是导致复选框被重置。

2 个答案:

答案 0 :(得分: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">

答案 1 :(得分:0)

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

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

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

您可能希望首先测试绑定而不进行模板化。如果这不能解决您的问题,那么也可以发布代码隐藏。