C# WPF TextBox в Template не изменяет Text

168
17 марта 2019, 06:10

Есть TextBox в Control Template ListBoxItem

<TextBox Grid.Column="2" Grid.Row="0" Text="{Binding (extensions:DetectorExtension.Data), RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" FontFamily="Arial" FontSize="16" Foreground="Black" SnapsToDevicePixels="True" Background="White" BorderBrush="Black" BorderThickness="0"/> // выше xmlns:extensions="clr-namespace:Test.Extensions"

и его Text биндится к Attached Property

public static readonly DependencyProperty DataProperty =
  DependencyProperty.RegisterAttached("Data", typeof(string),
      typeof(DetectorExtension), new PropertyMetadata(null));
public static string GetData(DependencyObject obj)
    => (string)obj.GetValue(DataProperty);
public static void SetData(DependencyObject obj, string value)
    => obj.SetValue(DataProperty, value);

ListBox:

<ListBox Grid.Column="0" Grid.Row="1" SelectionMode="Extended" ItemsSource="{Binding DetectorsViewModel}">
    <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Template" Value="{DynamicResource DetectorControlTemplate}"/>
            <Setter Property="extensions:DetectorExtension.Name" Value="{Binding Name}"/>
            <Setter Property="extensions:DetectorExtension.Data" Value="{Binding Data}"/>
        </Style>
   </ListBox.Resources>
</ListBox>

DetectorsViewModel:

private ObservableCollection<DetectorViewModel> detectorsViewModel;
public ObservableCollection<DetectorViewModel> DetectorsViewModel {
  get => this.detectorsViewModel;
  set => this.detectorsViewModel = value;
}

и Data в DetectorViewModel:

protected string data;
public string Data {
   get => this.data;
   set => SetProperty(ref this.data, value);
}

Биндинг работает и string показываеться в Text, и если изменять его програмно все тоже нормально, но если езменять в программе TextBox то данные не изменяються в View Model, ничего не происходит

Answer 1

По умолчанию, свойства зависимости используют одностороннюю привязку, поэтому надо или явно создавать свойство сразу с двухсторонней привязкой:

public static readonly DependencyProperty DataProperty =
    DependencyProperty.RegisterAttached("Data", typeof(string), typeof(DetectorExtension),
    new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

Или указывать эту двухстороннюю привязку в свойстве:

<TextBox Text="{Binding (extensions:DetectorExtension.Data), Mode=TwoWay,
                    RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" ...

Первый способ в данном случае предпочтительнее.

READ ALSO
С# WPF биндинг события

С# WPF биндинг события

Как можно биндить события подобно биндингу Command? Например double click можно забиндить таким образом чтобы в View Model узнать на что был собственно...

144
Запись байт в массив данных (C#)

Запись байт в массив данных (C#)

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

178
Работа с фото WPF

Работа с фото WPF

По задумке, получаем ссылку на фото, переносим его в папку с ресурсами, и вставляем фото в качестве заливки для EllipseОшибка:

243
Не запускается правильно loc контейнер Autofac

Не запускается правильно loc контейнер Autofac

Изучаю контейнеры, а именно AutofacВ моем примере у меня есть данные datatable, есть контейнер и два класса, реализующие один интерфейс, по логике...

217