wpf 用户控件内复选框的Issuing绑定不是fi [重复]

3vpjnl9f  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(113)

此问题已在此处有答案

DependencyProperty not triggered(2个答案)
Callback when dependency property recieves xaml change(2个答案)
上个月关门了。
在UserControl.xaml中:

<UserControl x:Class="OurNameSpace.SystemCalibration.Controls.PortSelector"
             xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
             xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
             xmlns:mc=http://schemas.openxmlformats.org/markup-compatibility/2006 
             xmlns:d=http://schemas.microsoft.com/expression/blend/2008 
             xmlns:local="clr-namespace:OurNamespace.SystemCalibration.Controls"
             xmlns:converters="clr-namespace:OurNamespace.SystemCalibration.Converters"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             x:Name="portSelector"
             mc:Ignorable="d">
<Grid …..
               <StackPannel ….
<CheckBox Content="Port 4" Margin="0 5 0 5"
                      IsChecked="{Binding cb4_IsChecked, ElementName=portSelector, UpdateSourceTrigger=PropertyChanged}">
                <CheckBox.Visibility>
                    <MultiBinding Converter="{StaticResource maxPortsToVisibilityConverter}">
                        <Binding Path="MaxPorts" ElementName="portSelector"/>
                        <Binding Source="{StaticResource port4}"/>
                    </MultiBinding>
                </CheckBox.Visibility>
              </CheckBox>
</StackPanel>
</Grid>

在usercontrol.xaml.cs中:

public partial class PortSelector : UserControl
{
public static readonly DependencyProperty cb4_isCheckedProperty = DependencyProperty.Register(nameof(cb4_IsChecked), typeof(bool), typeof(PortSelector));

public bool cb4_IsChecked
        {
            get => (bool)GetValue(cb4_isCheckedProperty);
            set
            {
                SetValue(cb4_isCheckedProperty, value);
                UpdatedSelectedPortsString();
            }
       }
}

如果我在调用“UpdatedSelectedPortsString”的行上放置一个断点,断点永远不会被命中。
此用户控件驻留在TabControl中的另一个用户控件中。当我单击复选框时,我期望执行dependencyproperty的Set部分,但该代码似乎根本没有被调用。我甚至尝试在Islets绑定中添加一个假值转换器,转换器中的代码会执行,但setter不会执行。如果不是绑定Islam,而是添加一个带有dependency属性的Command绑定,并将命令处理程序放在同一个usercontrol.xaml.cs代码隐藏分部类中,它也能正常工作。唯一似乎不起作用的是直接绑定Islam。

ttcibm8c

ttcibm8c1#

你必须像下面这样使用PropertyChangedCallback委托:

public static readonly DependencyProperty cb4_IsCheckedProperty = DependencyProperty.Register(nameof(cb4_IsChecked), typeof(bool), typeof(PortSelector), new PropertyMetadata(false, cb4_IsCheckedChangedCallback));
    public bool cb4_IsChecked
    {
        get { return (bool)GetValue(cb4_IsCheckedProperty); }
        set { SetValue(cb4_IsCheckedProperty, value); }
    }
    private static void cb4_IsCheckedChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        PortSelector uc = d as PortSelector;
        uc.UpdatedSelectedPortsString();
    }

每次更改IsChacked时都会调用“cb4_IschackedChangedCallback”方法。
如果这不管用的话。此代码应用于绑定:

IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:PortSelector}}, Path=cb4_IsChecked}"

相关问题