WPF, связывающий с данными для составления композита шаблоны класса?

Попытайтесь использовать "uname". Например, в Linux: "uname-a".

Согласно странице руководства, uname соответствует SVr4 и POSIX, таким образом, это должно быть доступно на Mac  OS  X и Cygwin также, но я не могу подтвердить это.

BTW: $OSTYPE также установлен на linux-gnu здесь:)

5
задан Peter M 29 July 2009 в 18:41
поделиться

2 ответа

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

int _first
public int First { get { return _first; } }

вы будете использовать First, а не _first для привязки. Обычно я видел, как каждый класс предоставляет свои собственные свойства для привязки, и в этом случае вы можете изменить свой код на:

class One : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    int _first = 1;
    int _second = 2;
    public int First { get { return _first; }
                       set { _first = value; OnPropertyChanged("First"); } }
    public int Second { get { return _second; }
                        set { _second = value; OnPropertyChanged("Second"); } }
}

class Two : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    string _third = "Third";
    string _fourth = "Fourth";
    public string Third { get { return _third; }
                          set { _third = value; OnPropertyChanged("Third"); } }
    public string Fourth { get { return _fourth; }
                           set { _fourth = value; OnPropertyChanged("Fourth"); } }
}

class Comp : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    int _int1 = 100;
    One _part1 = new One();
    Two _part2 = new Two();

    public One Part1 { get { return _part1; }
                       set { _part1 = value; OnPropertyChanged("Part1"); } }
    public Two Part2 { get { return _part2; }
                       set { _part2 = value; OnPropertyChanged("Part2"); } }

    public int Int1 { get { return _int1; }
                      set { _int1 = value; OnPropertyChanged("Int1"); } }
}

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

Comp comp = new Comp();
stack.DataContext = comp;

Затем вы можете выполнить привязку к частям в xaml следующим образом:

<Window x:Class="TestApp.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestApp"
    Title="Window1" Height="300" Width="300">
    <StackPanel Name="stack">
        <TextBlock Text="{Binding Int1}"/>
        <TextBlock Text="{Binding Part1.First}"/>
        <TextBlock Text="{Binding Part1.Second}"/>
        <TextBlock Text="{Binding Part2.Third}"/>
        <TextBlock Text="{Binding Part2.Fourth}"/>
    </StackPanel>
</Window>

здесь вы увидите, что StackPanel получает Comp как DataContext (и, следовательно, все его дочерние элементы также имеют этот DataContext, если не указан другой), и текст привязан к его классам-членам.

РЕДАКТИРОВАТЬ: Я также добавил в сеттеры, а также реализовал INotifyPropertyChanged, который является жизненно важным компонентом привязки данных. Благодаря этому вы сможете привязать свои данные к нескольким элементам управления и увидеть обновление данных во всех элементах управления при обновлении. Вам нужно будет добавить: с использованием System.ComponentModel;

4
ответ дан 14 December 2019 в 19:21
поделиться

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

class One {
  int _first;
  int _second;
  int First { get { return _first; } }
  int Second { get { return _second; } }
}

class Two {
  string _third;
  string _fourth;
  string Third { get { return _third; } }
  string Fourth { get { return fourth; } }
}

class Comp {
  int _int1;
  One _part1;
  Two _part2;
  One Part1 { get { return _part1; } }
  Two Part2 { get { return _part2; } }
}

Затем вы сможете привязать все, что захотите:

....
<TextBlock Name="txtBlock" Text="{Binding Path=Part2.Third}" />    
....
1
ответ дан 14 December 2019 в 19:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: