Как изменения в пользовательском интерфейсе могут изменить ListView объектов SelecteItem? - PullRequest
0 голосов
/ 19 июня 2019

У меня есть объекты List of Cube, мой ListView показывает имена этих кубов, когда куб выбран, его свойства отображаются в различных текстовых окнах, которые уже связаны с SelectedItem.Тем не менее, я не нашел способ использовать Xaml для привязки свойств SelectedItem к этим TextBox, чтобы изменения были применены немедленно.

Я уже пытался добиться этого с помощью события TextChanged, но я подумал, что, возможно,есть способ добиться этого лучше.

Редактировать: вот как это в основном работает.

listOfCubes.ItemsSource = cubes; //setting the source of type Cube

, связывающий представление

<ListView.View>
    <GridView>
        <GridViewColumn DisplayMemberBinding="{Binding Name}" />
    </GridView>
</ListView.View>

Один пример textBox

 <TextBox TextChanged="Cube_TextChanged"
          Text="{Binding Path=SelectedItem.RotateTransform.Rotation.Axis.X,
                         ElementName=listOfCubes}">

, который я пытаюсь заменить

private void Cube_TextChanged(object sender, TextChangedEventArgs e)
{
  //apply changes in Properties to the selected cube
}

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Проблема была решена с помощью режима привязки TwoWay.

<TextBox TextChanged="Cube_TextChanged"
      Text="{Binding Path=SelectedItem.RotateTransform.Rotation.Axis.X,
                     ElementName=listOfCubes, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
0 голосов
/ 19 июня 2019

Если я правильно понял: вам нужно обновлять свой персонал только при изменении его значения

, поэтому в основном добавьте это в вашу ViewModel

 public double X 
 {
   get => mX;
   set 
   {
       mX = value;
       OnXChanged();
       //notify
   }
 }
 private double mX;


 private void OnXChanged()
 {
    //your code
 }

, затем привяжите это так, НЕ ЗАБЫВАЙТЕ -> UpdateSourceTrigger=PropertyChanged

 <TextBox Text="{Binding SelectedItem.RotateTransform.Rotation.Axis.X,
                         ElementName=listOfCubes,
                         UpdateSourceTrigger=PropertyChanged}">

или , если вам нужно изменить текст в текстовом поле

, добавьте это в вашу модель представления

 public double Text 
 {
   get => mText;
   set 
   {
       mText = value;
       OnTextChanged();
       //notify
   }
 }
 private double mText;


 private void OnTextChanged()
 {
    //your code
 }

XAML

 <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}">

или , если вы хотите, чтобы оба значения (текст x и текстовое поле) находились в одном месте

 <TextBlox>
    <TextBlox.Text>    
        <MultiBinding Converter="{StaticResource YOUR_MULTI_CONVERTER}"
                      UpdateSourceTrigger="PropertyChanged">
            <Binding Path="Text" />
            <Binding Path="SelectedItem.RotateTransform.Rotation.Axis.X"
                     ElementName="listOfCubes" />
        </MultiBinding>
    </TextBlox.Text>
</TextBlox>

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