首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将属于两个不同控件的两个依赖项属性数据库化?

如何将属于两个不同控件的两个依赖项属性数据库化?
EN

Stack Overflow用户
提问于 2011-10-31 22:14:41
回答 1查看 1.3K关注 0票数 1

:如何通过两个依赖属性的绑定来订阅由定义的PropertyChanged事件?

我的主窗口中有两个独立的用户控件。一个控件包含影响另一个控件的参数,我们将其称为display控件。我希望参数控件充当显示控件的数据源,以便当我在参数控件中更改参数时,显示控件将进行监听和相应的响应。

为此,我创建了一个实现INotifyPropertyChanged的类,该类存储这些参数,并在两个控件中创建该类类型的依赖项属性。我原以为如果我将一个控件属性绑定到另一个控件属性,我就会得到所需的行为,但不幸的是,我遗漏了一些重要的东西,因为显示控件没有反应。

在对调试器进行更仔细的检查时,我注意到当属性更改时,事件PropertyChangedEventHandler PropertyChanged总是为空,而我所读到的所有内容都表明没有人在监听。

由于显示控件是实时创建的,因此必须以编程方式创建绑定,如下所示:

代码语言:javascript
运行
复制
var DispayControlValuesBinding = new Binding();
DispayControlValuesBinding.Source = DisplayControlsControl;
DispayControlValuesBinding.Path = new PropertyPath("DisplayControlValues");
DispayControlValuesBinding.Mode = BindingMode.OneWay;
DispayControlValuesBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
DispayControlValuesBinding.NotifyOnSourceUpdated = true;
//        
graph.SetBinding(Graph.DisplayControlValuesProperty, DisplayControlValuesBinding);

这两个控件都有一个名为DispayControlValues的依赖项属性。我尝试将DisplayControlControl的DisplayControlValues属性绑定到图形控件的DisplayControlValues属性。

当应用程序运行时,它初始化参数控件,然后通过用户请求以编程方式创建显示控件并进行绑定。然后,我在参数控件中更改一个值,这是实现INotifyPropertyChanged接口的parameters类捕获的,但是由于没有人监听,事件处理程序为null,这里是我被困住的地方。

非常感谢您的帮助!

这里有更多的详细信息,如您所要求:

我有一个用户控件,它公开更改另一个控件行为的参数。此控件具有一个依赖项属性,该属性包含参数详细信息并实现INotifyPropertyChanged接口。

这是一堂课:

代码语言:javascript
运行
复制
public class ZoomGraphControlValues : INotifyPropertyChanged
{
    private bool _displayRaw;
    public bool DisplayRaw
    {
        get { return _displayRaw; }
        set 
        {
            _displayRaw = value;
            OnPropertyChanged(new PropertyChangedEventArgs("DisplayRaw"));
        }
    }

    private bool _enableFit;
    public bool EnableFit
    {
        get { return _enableFit; }
        set
        {
            _enableFit = value;
            OnPropertyChanged(new PropertyChangedEventArgs("EnableFit"));
        }
    }

    public ZoomGraphControlValues()
    {}

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, e);
    }
}

下面是依赖项属性:

代码语言:javascript
运行
复制
public ZoomGraphControlValues ControlValues
    {
        get { return (ZoomGraphControlValues)GetValue(ControlValuesProperty); }
        set { SetValue(ControlValuesProperty, value); }
    }

    public static readonly DependencyProperty ControlValuesProperty =
        DependencyProperty.Register("ControlValues", typeof(ZoomGraphControlValues), typeof(ZoomGraphControls), new PropertyMetadata(null, OnControlValuesPropertyChanged));


    private static void OnControlValuesPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var myObj = d as ZoomGraphControls;
        myObj.OnControlValuesPropertyChanged(e);
    }

    private void OnControlValuesPropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        if (ControlValues != null)
        {
            IniValues();
        }
    }

那么我就有了显示用户控件。此控件还实现了与其他控件类型相同的依赖属性,我希望此控件是绑定的目标,因此当我在参数控件中更改值时,此控件反映更改。

下面是此控件的依赖项属性:

代码语言:javascript
运行
复制
    public ZoomGraphControlValues ZoomGraphControlValues
        {
            get { return (ZoomGraphControlValues)GetValue(ZoomGraphControlValuesProperty); }
            set { SetValue(ZoomGraphControlValuesProperty, value); }
        }

        public static readonly DependencyProperty ZoomGraphControlValuesProperty =
            DependencyProperty.Register("ZoomGraphControlValues", typeof(ZoomGraphControlValues), typeof(zoomGraph), new PropertyMetadata(null, OnZoomGraphControlValuesPropertyChanged));


        private static void OnZoomGraphControlValuesPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var myObj = d as zoomGraph;
            myObj.OnZoomGraphControlValuesPropertyChanged(e);
        }

        private void OnZoomGraphControlValuesPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
            if (ZoomGraphControlValues != null)
            {

  // update the control with the new parameters
  ShowRawData(ZoomGraphControlValues.DisplayRaw);
                SetChartBehabiour();
            }
        }

从应用程序周期开始,参数控制就初始化了。display控件根据用户的请求被创建到一个选项卡中,因此我必须以编程的方式创建该控件,从而实现绑定:

代码语言:javascript
运行
复制
//create the tab and wire tab events
//…

//create a display control

var graph = new zoomGraph();

// initialize the parameters class

var zgcv = new ZoomGraphControlValues
{
  DisplayRaw = true,
  ChartBehaviour = ChartBehaviour.Zoom
};

//assign the parameters class to the parameters user control dependency property

ZoomGraphControlsControl.ControlValues = zgcv;

//create the binding of the parameter control to the display control by linking their respective dependency properties

var zoomGraphControlValuesBinding = new Binding();
zoomGraphControlValuesBinding.Source = ZoomGraphControlsControl;
zoomGraphControlValuesBinding.Path = new PropertyPath("ControlValues");
zoomGraphControlValuesBinding.Mode = BindingMode.TwoWay;
zoomGraphControlValuesBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
zoomGraphControlValuesBinding.NotifyOnSourceUpdated = true;
zoomGraphControlValuesBinding.NotifyOnTargetUpdated = true;

graph.SetBinding(zoomGraph.ZoomGraphControlValuesProperty, zoomGraphControlValuesBinding);

//…
// add the user control to a tab

当我在参数控件中更改一个参数时,我可以看到它试图触发OnPropertyChanged事件,但它始终是空的。正因为如此,我认为我缺少一些东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-31 22:34:00

您将绑定模式设置为"OneWay“,这意味着当视图中的值发生变化时,视图模型将永远不会被更新。将绑定模式更改为"TwoWay“,然后重试。

另外,检查是否要更改"DisplayControlValues“的完整实例,还是只更改该类上的属性,因为绑定只在整个实例更改时才被设置为触发,而不是其属性。

此外,请记住,可以使用Binding.ElementName属性绑定两个不同控件的属性,这将使您不必创建视图模型,除非在这些值更改时代码中有任何内容需要处理。

如果您发布了更多的代码和XAML,将更容易找到解决问题的最合适的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7960417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档