Скопируйте texbox, включая его привязку - PullRequest
0 голосов
/ 29 мая 2018

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

Визуальная часть работает нормально,но я не могу заставить работать привязки, поэтому новое текстовое поле остается пустым.

XAML:

<StackPanel Grid.Row="3" Grid.Column="0" x:Name="SP_TB_DP_ArticleName"     x:Uid="ArticleName" Style="{StaticResource FavButton}"  MouseDown="FavButton_Click" >
   <Label  Content="ArticleName"  Style="{StaticResource Heading2}" />
    <Border Background="Transparent">
      <StackPanel Orientation="Horizontal">
        <Path Uid="FavAdd" Style="{StaticResource Ico-AddFav}" Fill="Black"/>
        <Path Uid="FavRem" Style="{StaticResource Ico-RemFav}" Fill="Black" Visibility="Collapsed" />
      </StackPanel>
     </Border>
    </StackPanel>
<TextBox  x:Name="TB_DP_ArticleName"  Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Style="{StaticResource Heading3}" Text="{Binding Article.Name, UpdateSourceTrigger=PropertyChanged}" />

C # привязки

private void FavButton_Click(object sender, MouseButtonEventArgs e)
{
[... creating textbox and label]

//BindingName is the name of the original textbox ie: TB_DP_ArticleName
DependencyObject OriginalTB = (DependencyObject) this.FindName(BindingName);
BindingBase BB = BindingOperations.GetBindingBase(OriginalTB, TextBox.TextProperty);
var oldBind = BB as Binding;

//Clone Method from other question Link see below *
//BindingBase copyBind= CloneBinding(BB, OriginalTB);


 if (OriginalTB != null)
 {
  Binding binding = new Binding();
  binding.Source = this;
  binding.Path = oldBind.Path;
  binding.Mode = BindingMode.OneWay;
  binding.IsAsync = false;
  binding.UpdateSourceTrigger = UpdateSourceTrigger.Default;
  binding.TargetNullValue = "null";
  BindingOperations.SetBinding(tb, TextBox.TextProperty, binding);
  //BindingOperations.SetBinding(tb, TextBox.TextProperty, copyBind);
 }

//Code to add the Textbox to the Grid 
[...]

*) Я попробовал метод cloneMethod из В Binding нет метода Clone, что является эффективным способом его копирования , но это не сработало.

Во время отладки oldBind.Path показывает правильный путь к статье.Name.

Но в итоге программно созданное текстовое поле не будет отображать содержимое исходного текстового поля.Он просто остается пустым.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Наконец я понял!

Мне пришлось установить источник привязки к исходному TextBox и установить привязку к тексту.Это не решает проблему на 100%, так как это может быть не самым удачным решением относительно комментария @AlvinfromDiaspar в Сохраняйте синхронизацию двух текстовых полей в WPF Но в любом случае, это работает достаточно хорошо для моих целей.

Что я изменил:

Binding binding = new Binding("Text"); binding.Source = (DependencyObject)this.FindName(BindingName);

Весь фрагмент привязки:

String BindingName = inName.Substring(3);

BindingBase BB = BindingOperations.GetBindingBase(
                 (DependencyObject)this.FindName(BindingName),
                 TextBox.TextProperty);

var oldBind = BB as Binding;

if (BB != null)
{
  //the magic goes here
  Binding binding = new Binding("Text");
  binding.Source = (DependencyObject)this.FindName(BindingName);

  binding.Mode = BindingMode.OneWay;
  binding.IsAsync = false;
  binding.UpdateSourceTrigger = UpdateSourceTrigger.Default;
  binding.TargetNullValue = "null";
  BindingOperations.SetBinding(tb, TextBox.TextProperty, binding);
 }
0 голосов
/ 29 мая 2018

Вместо того, чтобы пытаться дублировать привязки, просто дублируйте элементы управления (с их привязками данных, но не их именами), а затем (привязывайте к их свойству видимости), которые затем отобразят или скрывают элемент управления текстового поля на основе выбора пользователя.

<TextBox  Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2"
          Style="{StaticResource Heading2}" 
          Text="{Binding Article.Name, UpdateSourceTrigger=PropertyChanged}"  
          Visibility = "{Binding AmIVisible_1}" />


<TextBox  Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" 
          Style="{StaticResource Heading3}" 
          Text="{Binding Article.Name, UpdateSourceTrigger=PropertyChanged}"  
          Visiblity="{Binding AmIVisible_2}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...