Как установить свойство, вызвав метод - PullRequest
0 голосов
/ 18 февраля 2010

Я хотел бы знать, как установить пользовательское свойство пользовательского элемента управления, вызвав метод, который будет служить «поставщиком данных» для этого свойства.

Я имею в виду, что я хотел бы написать что-то вроде этого:

<CatsUserControl Cats={FindAllCats} />,

, где CatsUserControl - созданный мной пользовательский элемент управления (свойство с именем Cats ), а FindAllCats () - метод, написанный на C #, который возвращает список объектов Cat.

Возможно ли это?

Я ценю любые идеи. Спасибо!

РЕДАКТИРОВАТЬ:

Все началось с того, что я хотел иметь возможность назначать список свойству в XAML, так же, как вы делаете <Button Content="Value"/> (за исключением того, что в моем случае Value является более сложным типом, чем строка, это List<KeyValuePair<String, Boolean>>).

Поскольку я не нашел никакого способа сделать это, я подумал, что можно вызвать метод, который возвращает этот список, и вместо этого присвоить возвращаемое значение свойству.

Надежда, которая проясняет ситуацию.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2010

Похоже, то, что вы пытаетесь сделать, это просто привязка данных?

Другими словами, вы бы подошли к этому так:

<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));
        }
    }
}

, а затем привязать его к вашему пользовательскому контролю пользователя:

<CatsUserControl Cats="{Binding AllCats, Source={StaticResource BindingToCats}}" />
1 голос
/ 20 февраля 2010

Вероятно, вы ищете TypeConverter .

. Вот пример того, как вы можете установить список >, используя строку в синтаксисе атрибута.в 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);
    }
}
0 голосов
/ 18 февраля 2010

Вы должны иметь возможность делать то, что вы просите, подписавшись на события, а не связываясь напрямую из XAML.

Также вы можете использовать конвертер, который описан здесь .

...