如何通过调用方法来设置属性

时间:2010-02-18 18:19:51

标签: silverlight silverlight-3.0 user-controls

我想知道如何通过调用一个可以作为该属性的“数据提供者”的方法来设置自定义用户控件的自定义属性。

我的意思是我想写这样的东西:

<CatsUserControl Cats={FindAllCats} />

其中 CatsUserControl 是我创建的用户控件(其中有一个名为 Cats 的属性),而 FindAllCats()是一个用返回Cat对象列表的C#。

这可能吗?

我很欣赏任何想法。谢谢!

编辑:

整个过程开始是因为我希望能够在XAML中为一个属性分配一个列表,就像你<Button Content="Value"/>一样(除了在我的例子中,Value是一个比字符串更复杂的类型,这是一个List<KeyValuePair<String, Boolean>>)。

因为我没有找到任何方法,我认为可以调用一个返回此列表的方法,并将返回的值分配给属性。

希望能让事情更清晰。

3 个答案:

答案 0 :(得分:2)

你想要做的似乎只是数据绑定?

换句话说,你会这样做:

<CatsUserControl ItemsSource="{Binding AllCats}" />

Binding to a collection

如果你想专门绑定到一个名为Cats的属性,你需要创建一个实现INotifyPropertyChanged的对象。 (半伪代码如下):

//binding to this public property in the CatsUserControl    
public List<Cat> Cats;


public class BindingToCats : INotifyPropertyChanged
{
    private List<Cat> allCats;

    public List<Cat> AllCats
    {
        get { return allCats; }
        set
        {
            allCats = value;
            OnPropertyChanged("AllCats");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

然后使用自定义usercontrol绑定到它:

<CatsUserControl Cats="{Binding AllCats, Source={StaticResource BindingToCats}}" />

答案 1 :(得分:1)

您可能正在寻找的是TypeConverter

以下是如何设置List&lt; KeyValuePair&LT;字符串,布尔值&gt;&gt;在xaml中使用属性语法中的字符串。 Xaml最终会看起来像:

<c:CustomButton Values="Hello World,true; Foo,false; Bar,true" />

您希望如何表示键/值对列表的确切语法取决于您。

以下是执行此操作所需的代码:

public class CustomButton : Button
{
    [TypeConverter(typeof(ListOfStringAndBoolPairsTypeConverter))]
    public List<KeyValuePair<String, Boolean>> Values { get; set; }
}

public class ListOfStringAndBoolPairsTypeConverter : TypeConverter
{
    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        //TODO: Should add better error handling here.
        var stringValue = (string)value;
        var pairs = stringValue.Split(';').Select(ps => ParsePair(ps));

        var result = new List<KeyValuePair<String, Boolean>>();
        result.AddRange(pairs);
        return result;
    }

    private KeyValuePair<String, Boolean> ParsePair(string pairStringValue)
    {
        var splitString = pairStringValue.Split(',');
        var key = splitString[0];
        var value = Boolean.Parse(splitString[1].Trim());
        return new KeyValuePair<string, bool>(key, value);
    }
}

答案 2 :(得分:0)

你应该能够通过订阅活动而不是直接从XAML绑定来做你所要求的。

此外,您可以使用转换器,其描述为here