【问题标题】:wpf xaml checkbox template in style样式中的wpf xaml复选框模板
【发布时间】:2014-10-15 02:13:11
【问题描述】:

第一篇文章,所以请放轻松。 我正在尝试从另一个页面获取复选框的值(这是 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# 答案的点击过程。总是导致复选框被重置。

【问题讨论】:

    标签: wpf xaml checkbox binding ischecked


    【解决方案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">
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 感谢您的快速回复,我尝试将绑定更改为复选框本身,但没有效果。你能澄清一下 DataContext 的设置是什么/意味着我对术语道歉很陌生。还需要有任何代码吗?复选框不记得自己的状态似乎很奇怪。
      • 还取消了复选框的样式并正常运行,一旦离开页面,它仍然会重置值。
      • 太好了,您找到了解决方案。该复选框会丢失其状态,因为在您第一次尝试时它将被重新加载并实例化。 datacontext 代表绑定的来源。您可以在此处找到有关 DataContext 和绑定的更多信息:wpf-tutorial.com/data-binding/using-the-datacontext
      猜你喜欢
      • 2016-04-14
      • 1970-01-01
      • 2013-07-12
      • 2012-11-30
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多