我想知道如何通过调用一个可以作为该属性的“数据提供者”的方法来设置自定义用户控件的自定义属性。
我的意思是我想写这样的东西:
<CatsUserControl Cats={FindAllCats} />
,
其中 CatsUserControl 是我创建的用户控件(其中有一个名为 Cats 的属性),而 FindAllCats()是一个用返回Cat对象列表的C#。
这可能吗?
我很欣赏任何想法。谢谢!
编辑:
整个过程开始是因为我希望能够在XAML中为一个属性分配一个列表,就像你<Button Content="Value"/>
一样(除了在我的例子中,Value是一个比字符串更复杂的类型,这是一个List<KeyValuePair<String, Boolean>>
)。
因为我没有找到任何方法,我认为可以调用一个返回此列表的方法,并将返回的值分配给属性。
希望能让事情更清晰。
答案 0 :(得分:2)
你想要做的似乎只是数据绑定?
换句话说,你会这样做:
<CatsUserControl ItemsSource="{Binding AllCats}" />
如果你想专门绑定到一个名为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。