DataContext и привязка self как RelativeSource

может кто-нибудь объяснить мне следующую строку XAML?

DataContext="{Binding RelativeSource={RelativeSource Self}}"

здесь простой пример использования.

Как заменить эту строку с C# код?

3 ответов


это просто устанавливает DataContext свойство, равное объекту со свойством. Эквивалент кода будет this.DataContext = this;

редактировать

на DataContext свойство-это объект, который используется в качестве контекста для всех привязок, возникающих на этом объекте и его дочерних объектах. Если у вас нет DataContext правильно установите модель, к которой вы хотите привязаться, все ваши привязки завершатся ошибкой.

Edit2

вот как установите его в коде позади (соответствующий вашему примеру):

public partial class ListViewTest : Window
{
    ObservableCollection<GameData> _GameCollection = 
        new ObservableCollection<GameData>();

    public ListViewTest()
    {
        _GameCollection.Add(new GameData { 
          GameName = "World Of Warcraft", 
          Creator = "Blizzard", 
          Publisher = "Blizzard" });
        _GameCollection.Add(new GameData { 
          GameName = "Halo", 
          Creator = "Bungie", 
          Publisher = "Microsoft" });
        _GameCollection.Add(new GameData { 
          GameName = "Gears Of War", 
          Creator = "Epic", 
          Publisher = "Microsoft" });

        InitializeComponent();

        this.DataContext = this;   //important part
    }

    public ObservableCollection<GameData> GameCollection
    { get { return _GameCollection; } }

    private void AddRow_Click(object sender, RoutedEventArgs e)
    {
      _GameCollection.Add(new GameData { 
          GameName = "A New Game", 
          Creator = "A New Creator", 
          Publisher = "A New Publisher" });
    }
}

это означает, что "DataContext является владельцем этого свойства DataContext", таким образом, элемент управления.

В C# это будет

myTextBox.DataContext = myTextBox;

чтобы ответить на ваш второй вопрос: Иногда может быть полезно объявить DataContext на XAML, потому что вы можете видеть привязку данных во время разработки. Если вы объявите его кодом, привязка данных будет выполняться только во время выполнения.

есть и другие способы достижения времени разработки (поддельные) данные. Чтобы узнать больше, пожалуйста, запрос о "изгибаемость".

Примечание: как правило, помните, что если у вас есть другой вопрос, вы должны создать новый запрос stackoverflow: -)