Для пользовательского элемента управления, как установить привязку элемента шаблона элемента к пользовательскому свойству? - PullRequest
4 голосов
/ 22 октября 2010

У меня есть простой пользовательский элемент управления, который, по сути, представляет собой просто AutoCompleteBox с некоторой настраиваемой логикой.

Для конкретного экземпляра (набора персон) я хочу, чтобы он выглядел следующим образом:

<sdk:AutoCompleteBox Name="myACB" ItemsSource="{Binding People}" FilterMode="StartsWith" MinimumPrefixLength="2" ValueMemberBinding={Binding LastName}>
  <sdk:AutoCompleteBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding LastName}" />
    </DataTemplate>
  </sdk:AutoCompleteBox.ItemTemplate>
</sdk:AutoCompleteBox>

Однако я хочу сделать источник данных универсальным, и поэтому отображаемые значения будут другими (ValueMemberBinding и текст TextBlock шаблона).Вот почему я делаю пользовательский элемент управления, чтобы я мог указать различия со свойствами.

У меня нет проблем при настройке источника со свойством пользовательского элемента управления, но у меня возникают проблемы со свойствами привязки дисплея.Сейчас у меня есть:

public static DependencyProperty DisplayMemberProperty = DependencyProperty.Register("DisplayMember", typeof(string), typeof(myAutoComplete), null);

public string DisplayMember
{
    get
    { return myACB.ValueMemberPath; }
    set
    {
        myACB.ValueMemberPath = value; // this works fine
        // but how can set the text binding for the templated textblock?
    }
}

Я хочу, чтобы свойство DisplayMember было именем свойства, которое будет отображаться для любого вида пользовательской коллекции (людей, автомобилей и т. Д.), Которую я связал с AutoCompleteBox.

Я не думаю, что смогу изменить таблицу данных программно.Есть ли способ сделать это с помощью привязки (относительный источник)?

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

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

0 голосов
/ 27 октября 2010

Спасибо за предложения.

Мне не удалось найти решение, которое я предпочел, но мой обходной путь - просто передать ресурс таблицы данных в качестве свойства, и он назначается элементу шаблона autocompletebox.

Определить шаблон:

<DataTemplate x:Key="myCustomDT">
    <!-- whatever you want here -->
</DataTemplate>

Создать для него свойство пользовательского элемента управления:

public static DependencyProperty DisplayTemplateProperty = DependencyProperty.Register("DisplayTemplate", typeof(DataTemplate), typeof(myAutoComplete), null);
public DataTemplate DisplayTemplate {
    get { return myACB.ItemTemplate; }
    set { myACB.ItemTemplate = value; }
}

Сейчас:

<local:myAutoComplete DisplayTemplate="{StaticResource myCustomDT}" />

Не самый лучший метод, но пока это будет работать.

0 голосов
/ 22 октября 2010
<TextBlock Text="{TemplateBinding DisplayMember}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...