Не удается справиться с привязкой TextBox.Text с назначенным шаблоном - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть модель Partner:

public class Partner
{
    public Guid Id { get; set; }
    public string Title { get; set; }
    public string Comment { get; set; }

    public override string ToString()
    {
        return Title;
    }
}

. Просмотр с помощью этого xaml:

<Window x:Class="WpfExtandedTextBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ModelViews="clr-namespace:WpfExtandedTextBox"
        d:DataContext="{d:DesignInstance ModelViews:ViewModel}"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">

    <Window.Resources>
        <ControlTemplate x:Key="entityTextBoxTemplate" TargetType="TextBox">
            <StackPanel Orientation="Horizontal">

                <TextBox MinWidth="200" Text="{Binding Partner.Title, Mode=TwoWay}"/>
                <TextBlock MaxWidth="0" Visibility="Hidden" Text="{Binding Partner.Id, Mode=TwoWay}"/>

                <Button x:Name="OpenPartnerList" Content="..." Click="OpenPartnerList_Click"/>
                <Button x:Name="OpenPartner" Content="O" Click="OpenPartner_Click"/>
                <Button x:Name="ClearPartner" Content="X" Click="ClearPartner_Click"/>

            </StackPanel>
        </ControlTemplate>
    </Window.Resources>

    <StackPanel Orientation="Vertical" >

        <TextBox x:Name="TextBoxSelectedPartner" Template="{StaticResource entityTextBoxTemplate}" HorizontalAlignment="Center" VerticalAlignment="Center" />
        <!--<Button x:Name="ChoosePartner" Click="ChoosePartner_Click" Content="Choose partner"/>
        <DataGrid ItemsSource="{Binding Partners}" AutoGenerateColumns="True" />-->

    </StackPanel>

</Window>

и просмотр модели:

public class ViewModel : BaseViewModel
    {
        private List<Partner> partners;
        public List<Partner> Partners
        {
            get { return this.partners; }
        }

        private Partner partner;
        public Partner Partner
        {
            get { return this.partner; }
            set
            {
                this.partner = value;
                NotifyPropertyChanged();
            }
        }

        public ViewModel()
        {
            AppDbContext db = new AppDbContext();
            this.partners = db.Partners.ToList();
            db.Dispose();
        }
    }

Я хочу создатьTextBox с 3 кнопками: 1 - для выбора Партнера из некоторого списка 2 - для открытия окна с данными Партнера 3 - для очистки TextBox

Для этой цели я создал ControlTemplate "entityTextBoxTemplate": TextBox для хранения Partner.Заголовок и скрытый TextBlock предназначен для хранения Partner.Id.Я предполагаю, что после выбора Партнера из списка TextBox и TextBlock будут заполнены соответственно Title и Id, но это не работает, и я не знаю почему.Кто-нибудь может мне помочь решить эту проблему?

Обновлено: Партнер заполнен этим кодом:

private void PartnerListView_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        viewModel.Partner = ((PartnerListView)sender).SelectedPartner;
    }

Обновлено 2:

Моя BaseViewModel:

public class BaseViewModel
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Мой фиксированный BaseViewModel:

public class BaseViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Я просто забыл указать реализованный интерфейс: ": INotifyPropertyChanged"

1 Ответ

0 голосов
/ 06 декабря 2018

Партнером вашего класса может быть INotifyPropertyChanged (я поставил вам код для заголовка, и то же самое для других параметров вашего объекта)

public class Partner : INotifyPropertyChanged
{
    private string title;
    public string Title
    {
       get { return this.title; }
       set
       {
          if (this.title != value)
          {
             this.title = value;
             this.NotifyPropertyChanged("Title");
          }
       }
    }

    public override string ToString()
    {
        return Title;
    }
    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propName)
    {
       if (this.PropertyChanged != null)
       this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}
...