C# 将属性更改为依赖项对象时发生绑定错误

C# 将属性更改为依赖项对象时发生绑定错误,c#,wpf,bind,C#,Wpf,Bind,我使用以下代码在我的控制下使用一个等级系统: public class FlowProWorkingClass:DependencyObject { public TUnitSystemClass ProjectUnitSystem { get { return Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x

我使用以下代码在我的控制下使用一个等级系统:

public class FlowProWorkingClass:DependencyObject
{
    public TUnitSystemClass ProjectUnitSystem
    {
        get
        {
            return Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x.Id == Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId);
        }
        set
        {
            throw new Exception("Project Unit System can not be setted here!");}
        }
}
我已将其绑定到我的控件,如下所示:

<WPFTextBoxUnitConverterControl:TextBoxUnitConvertor
    x:Name="txtGasPhaseFlowCoefficient" UnitSystem="{Binding currentFlowProWorkingClass.ProjectUnitSystem, Mode=OneWay, Source={StaticResource CurrentFlowProWorkingClass}, UpdateSourceTrigger=PropertyChanged}"
    Height="27" Margin="167,245,0,0"  VerticalAlignment="Top" HorizontalAlignment="Left" Width="171"/>
但是现在,控件根本没有绑定! 有什么问题吗? 注意:当我编写下面的代码时,绑定被完全忽略了!根本不调用get方法!为什么?

public static DependencyProperty ProjectUnitSystemProperty =
    DependencyProperty.Register(
        "ProjectUnitSystem",
        typeof(TUnitSystemClass),
        typeof(FlowProWorkingClass),
        new PropertyMetadata(ProjectUnitSystemOnChanged));

private static void ProjectUnitSystemOnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}

public TUnitSystemClass ProjectUnitSystem
{
    get
    {
        SetValue(ProjectUnitSystemProperty, Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x.Id == Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId));
        return (TUnitSystemClass) GetValue(ProjectUnitSystemProperty);
    }
    set
    {
        throw new Exception("Project Unit System can not be setted here!");
    }
}

SetValue
设置依赖项属性的所谓本地值,该值替换以前指定的任何(单向)绑定

因此,属性getter可以有效地删除绑定。它不能调用
SetValue

get
{
    SetValue(ProjectUnitSystemProperty, ...); // remove this line
    return (TUnitSystemClass)GetValue(ProjectUnitSystemProperty);
}
任何读/写依赖项属性的CLR包装必须与以下内容完全相同:

public PropertyType PropertyName
{
    get { return (PropertyType)GetValue(PropertyNameProperty); }
    set { SetValue(PropertyNameProperty, value); 
}

有关只读依赖项属性,请查看MSDN上的文章。

我对其进行了修订,但它们没有正确显示!请有人编辑它,因为我不能这样做!从财产设定者那里抛出例外是毫无意义的。将属性设置为只读。@clemens-必须在get中获取的另一个属性中以另一种方式设置该属性!“Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems”没有任何意义。抛出异常的属性设置程序不应该存在。注意,我们说get和set也是过去式,而不是getted和setted。另一个注意事项是,在单向绑定上设置
UpdateSourceTrigger=PropertyChanged
。你应该移除它。作为一般规则,除非您实际需要,否则永远不要设置它。不幸的是,get必须首先从另一个属性“Classes.CurrentFlowProWorkingClass.GeneralOptions.ListoUnitSystems.Find(x=>x.Id==Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId)”获取值,然后返回!依赖项属性不是这样工作的。您必须在调用getter之前调用SetValue,而不是在getter内部。我需要get返回属性“Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUni”的实时值‌​tSystems.Find(x=>x.Id==Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUni‌​tSystemId)“!我可以这样做吗?不要将ProjectUnitSystem设置为依赖属性。我需要在更改时通知它,以更改绑定到它的所有控件
public PropertyType PropertyName
{
    get { return (PropertyType)GetValue(PropertyNameProperty); }
    set { SetValue(PropertyNameProperty, value); 
}