Встроенное связывание данных XAML не работает;код за связыванием работает - PullRequest
1 голос
/ 09 июля 2010

Привет, ребята! У меня проблема с привязкой данных WPF, с которой, я надеюсь, вы сможете помочь. Я новичок в WPF, но опытный разработчик (VB 3.0-6.0, C #).

Вот сценарий: У меня есть проект C # под названием MasterPartsData, который содержит ряд классов, которые представляют различные типы частей (конденсатор, диод и т. Д.). Они наследуются от базового класса, называемого clsPart.

У меня есть другой проект C # WPF, который содержит пользовательские элементы управления WPF (а также главное окно) для визуального представления значений, хранящихся в отдельном объекте MasterPartsData (MPD). Я создал личное поле в usercontrol для хранения объекта с помощью метода get и set.

Если я явно создаю привязку в установщике для заполненного объекта:

_capacitor = value;
Binding binding = new Binding();
binding.Source = _capacitor;
binding.Path = new PropertyPath("C0uf");
this.txtC0uf.SetBinding(TextBox.TextProperty, binding);

(с _capacitor, являющимся переменной закрытого объекта, и C0uf, являющимся именем свойства) значение отображается правильно.

Однако я не хочу явно создавать каждую привязку в коде. Я предпочитаю создавать встроенные привязки в XAML, возможно, с DataContext, указывающим на объект.

К сожалению, каждая перестановка, которую я пробовал, не работает; в текстовом поле не отображаются данные.

У меня есть пара подозрений: 1) Привязка верна, но текстовое поле необходимо обновить. 2) Связывание перепутано между частной переменной и свойствами. 3) Может быть, тот факт, что класс определен в другом проекте, вызывает проблемы. 4) Я схожу с ума и должен проверить себя в убежище, прежде чем кто-то пострадает. :)

Буду признателен за любую помощь, которую вы сможете оказать. Я более чем счастлив добавить больше информации, но не хотел загромождать вопрос страницами и страницами источника.

Ответы [ 2 ]

4 голосов
/ 09 июля 2010

Что касается ваших подозрений:

1) Я думаю, что поведение привязки по умолчанию для TextBox равно TwoWay, с триггером обновления LostFocus, что означает, что ваш фокус пользовательского интерфейса должен будет изменитьсядругому элементу управления до обновления привязки, если в пользовательский интерфейс внесены изменения.

Если в код внесены изменения, вам нужно вызвать событие NotifyPropertyChanged, чтобы система привязки увидела его.

2) Вероятно, это не тот случай, но у вас создается впечатление, что вы пытаетесь установить привязки для ваших свойств UserControl, а это не тот способ, которым привязка данных была разработана для использования в этом конкретном случае.вид варианта использования.Вам нужно привязать данные из не-UI классов к свойствам зависимостей на UserControl s.

3) Это никогда не будет иметь значения, пока ваш проект пользовательского интерфейса имеет ссылкуна ваши уроки.

4) Это обычная реакция людей, когда они начинают использовать XAML и WPF.Это похоже на то, что вместо того, чтобы вручить коробку с Legos, вы просто получили машину для литья под давлением с недостаточными инструкциями, не так ли?

В целом, это ситуация, когда вам может понадобиться проверить ваш дизайн;элементы шаблона «Model-View-ViewModel» пригодятся.Если вы не знакомы с этим, это шаблон разработки, в котором вы вводите класс «ViewModel», возможно, вы можете назвать его MasterPartsVM, который содержит реализацию INotifyPropertyChanged.

DataContext вашего UserControl будет установлен в этот MasterPartsVM класс.

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

class PartViewModel : INotifyPropertyChanged
{

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    public PartClass Data { get; set; }

    public String SomeVMProperty
    {
        get { return Data.SomeProperty; }

        set
        {
            if (Data.SomeProperty != value)
                Data.SomeProperty = value;
            this.PropertyChanged(this, new PropertyChangedEventArgs("SomeVMProperty"));
        }
    }

}

class PartClass
{
    public string SomeProperty { get; set; }
}

XAML базового UserControl будет выглядеть так:

<UserControl x:Class="WpfApplication1.PartUserControl"
            ... >
    <Grid>
        <TextBox Text="{Binding SomeVMProperty}" Margin="68,77,104,176" />
    </Grid>
</UserControl>

Чтобы подключить ваш класс данных к этомуUserControl, вы устанавливаете свойство DataContext UserControl.Если вы делаете это в коде, это вопрос наличия ссылки на ваш пользовательский элемент управления и ViewModel, а затем установки свойства:

MyUserControlInstance.DataContext = new PartViewModel(); // or some existing PartViewModel

Эта комбинация кода должна работать, чтобы создать текстовое поле с Text свойство изменяется каждый раз, когда изменяется свойство SomeVMProperty.

1 голос
/ 09 июля 2010

В базовом сценарии связывания, если ваш класс выглядит следующим образом

public class MasterPartsData
{
    private string _c0uf;

    public string C0uf
    {
        get { return _c0uf;}
        set { _c0uf = value;}
    }

    public MasterPartsData()
    {
        C0uf = "Hello World!";
    }
}

ваш XAML будет выглядеть так

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow" >
    <Window.DataContext>
        <local:MasterPartsData />
    </Window.DataContext>

    <Grid>
        <TextBlock Text="{Binding Path=C0uf}" />
    </Grid>
</Window>

Обратите внимание, что существует множество разных подходов к настройке DataContext, вам не обязательно просто делать это в XAML

Кроме того, обычно ваш класс MasterDataParts реализует INotifyPropertyChanged

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...