WPF: Как данные связывают объект с элементом и применяют шаблон данных через код? - PullRequest
1 голос
/ 22 декабря 2010

Я создал класс LeagueMatch.

public class LeagueMatch
{
    public string Home
    {
        get { return home; }
        set { home = value; }
    }

    public string Visitor
    {
        get { return visitor; }
        set { visitor = value; }
    }

    private string home;
    private string visitor;

    public LeagueMatch()
    {
    }
}

Далее я определил ресурс таблицы данных для LeagueMatch объектов в XAML:

<DataTemplate x:Key="MatchTemplate" DataType="{x:Type entities:LeagueMatch}">
    <Grid Name="MatchGrid" Width="140" Height="50" Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="{Binding Home}" />
        <TextBlock Grid.Row="1" Text="- vs -" />
        <TextBlock Grid.Row="2" Text="{Binding Visitor}" />
    </Grid>    
</DataTemplate>

В коде XAML я хочу создать объект ContentPresenterи установить привязку данных к ранее инициализированному объекту LeagueMatch и применить определенный шаблон данных.Как это должно быть сделано?Благодарю.

Решение

LeagueMatch match = new LeagueMatch("A team", "B team");

ContentPresenter contentPresenter = new ContentPresenter();
contentPresenter.ContentTemplate = this.FindResource("MatchTemplate") as DataTemplate;
Binding binding = new Binding();
binding.Source = match;
contentPresenter.SetBinding(ContentPresenter.ContentProperty, binding);

matchSlot.Children.Clear();
matchSlot.Children.Add(contentPresenter);

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010
<ContentPresenter ContentTemplate="{StaticResource yourTemplate}" 
                   DataContext="{Binding Match}"/>

В коде позади:

ContentPresenter c = new ContentPresenter();
c.ContentTemplate = FindResource("yourTemplate");
Binding b = new Binding();
b.Path = "Match"; // if the object is a property on someObject, otherwise leave it out.
b.Source = someObject;

c.SetBinding(ContentPresenter.ContentProperty, b);

Реализация INotifyPropertyChanged

public class Sample : INotifyPropertyChanged
{
  private string sampleField = "";

  public string SampleProperty
  {
    get { return sampleField; }
    set
    {
       sampleField = value;
       RaisePropertyChanged("SampleProperty");
    }
  }

  #region INotifyPropertyChanged

  public event PropertyChangedEventHandler PropertyChanged;

  private void RaisePropertyChanged(string property)
  {
     var handler = PropertyChanged;
     if(handler != null)
        handler(this, new PropertyChangedEventArgs(property));
  }
}

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

0 голосов
/ 22 декабря 2010

Вам необходимо привязать свойство Content в ContentPresenter, а не DataContext, чтобы применить шаблон к вашим данным:

contentPresenter.SetBinding(ContentPresenter.ContentProperty, binding);
...