wpf附加属性不起作用

时间:2015-08-18 10:08:11

标签: c# wpf

我只想将参数传递给控件。但它输出错误"输入字符串的格式不正确。"为什么?* *

的Xaml

<Views:SomeView  SecurityId="abc"></Views:SomeView>

型号:

class Data
{
    public string Case { get; set; }
    public Data(int _input)
    {
        if (_input==1)
        {
            Case = "First";
        }
        else
        {
            Case = "Second";
        }
    }
}

ViewModel:

class DataViewModel
{
    public string GetData
    {
        get
        {
            return D.Case;
        }

        set
        {
            D.Case = value;
        }
    }

    public Data D;
    public DataViewModel(string i)
    {
        D = new Data(Convert.ToInt16(i));
    }

}

MainWindow

public partial class SomeView : UserControl
{
    public string SecurityId
    {
        get
        {
            return (string)GetValue(SecurityIdProperty);
        }
        set { SetValue(SecurityIdProperty, value); }
    }
    public static readonly DependencyProperty
        SecurityIdProperty =
        DependencyProperty.Register("SecurityId",
        typeof(string), typeof(SomeView),
        new PropertyMetadata(""));

    public SomeView()
    {
        DataContext = new DataViewModel(SecurityId);
        InitializeComponent();
    }
}

2 个答案:

答案 0 :(得分:3)

你从未听过改变。

使用DataViewModel在构造函数调用时具有的值构造SecurityId。哪个是默认""。然后通过XAML将值更改为"abc"。但这种变化并没有在任何地方传播。它发生了,没有人关心。您DataViewModel的构建工作已经完成。

你想听听变化吗?我不能说。您需要为依赖项属性注册更改处理程序。

在PropertyMetaData中,您可以将更改的事件处理程序作为第二个参数传递,例如静态方法:

public static readonly DependencyProperty
    SecurityIdProperty =
    DependencyProperty.Register("SecurityId",
    typeof(string), typeof(SomeView),
    new PropertyMetadata("", new PropertyChangedCallback(MyValueChanged)));

然后您可以使用方法来处理更改:

private static void MyValueChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
   // react on changes here
}

顺便说一句,它不是附属物。它是一个正常的依赖属性。

答案 1 :(得分:0)

这是因为,您尝试将“abc”解析为整数,但您不处理由ConvertTo.Int16()方法引起的异常。
写DataViewModel构造函数,如

public DataViewModel(string i)
    {
        int value = 0;
        int.TryParse(i, out value); // TryParse handles the exception itself.
        D = new Data(value);
    }