WPF MulitBinding для Slider и TextBox не обновляет свойство - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь использовать MultiBinding для привязки ползунка к текстовому полю (что работает) и привязки TextBox к свойству (которое не работает). Привязка TextBox / Property прекрасно работает с одиночной привязкой, но когда я ввожу MultiBinding, она ломается.

Вот мой XAML

<Slider 
    Name="SliderExportQuality"
    Value="100"
    Minimum="0"
    Maximum="100"
    HorizontalAlignment="Left" 
    Margin="10,5,0,0" 
    VerticalAlignment="Top" 
    Width="239"/>
<TextBox>
    <TextBox.Text>
        <MultiBinding StringFormat="N2">
            <Binding ElementName="SliderExportQuality" Path="Value"/>
            <Binding Path="ExportQuality" UpdateSourceTrigger="PropertyChanged"/>
        </MultiBinding>
    </TextBox.Text>
</TextBox>

Вот диалоговое окно. TextBox обрезается красным после того, как я пытаюсь ввести значение непосредственно в него, что говорит мне, что что-то не так?

enter image description here

Я немного прочитал о MultiBinding и думаю, что с моим Конвертером я ошибаюсь, но не знаю, каким он должен быть.

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Как уже упоминали другие в комментариях, если я не неправильно понял вопрос, вам не нужно мультисвязывание, чтобы выполнить то, что вы пытаетесь сделать.Чтобы получить значение ползунка для отображения в текстовом поле (и наоборот), вам просто нужно привязать значение к общему свойству в вашей модели представления.

Например, с учетом следующего xaml:

    <Grid Margin="20" VerticalAlignment="Center">
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="*"/>
         <ColumnDefinition Width="100"/>
      </Grid.ColumnDefinitions>

      <Slider Grid.Column="0" Minimum="0" Maximum="100" Value="{Binding FileSize}"/>
      <TextBox Grid.Column="1" Text="{Binding FileSize}"/>
   </Grid>

У вас есть ползунок, который привязывает его значение к свойству FileSize в вашей модели представления.

Связанная ViewModel:

   class MainWindowViewModel : INotifyPropertyChanged
   {
      public int FileSize
      {
         get
         {
            return mFileSize;
         }
         set
         {
            if(mFileSize != value)
            {
               mFileSize = value;
               OnPropertyChanged(nameof(FileSize));
            }
         }
      } private int mFileSize = 50;

      private void OnPropertyChanged(String propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
      public event PropertyChangedEventHandler PropertyChanged;
   }

Это позволяет изменять значение либо с помощью ползунка, либо путем ввода непосредственно в текстовое поле.Все еще должна быть проверка ошибок в текстовом поле, поскольку пользователь может вводить что угодно ... Но это показывает основную концепцию.

Это создает следующий пользовательский интерфейс.

enter image description here

Я надеюсь, что это отвечает на вопрос, который вы задавали.

0 голосов
/ 10 мая 2019

Когда вы используете эту привязку, она попытается установить "75" (обратите внимание, что string) и значение ExportQuality (хотя тип этого значения не известен) для свойства Slider.Value, котороеdouble, он имеет красную рамку, потому что тип неправильный (т.е. TextBox пытается использовать неправильный тип для Binding, это также происходит, если вы привязываете TextBox к свойству int и вводите «a»), если вы используетеконвертер, это тот случай, когда в этом случае будет использоваться ConvertBack();

FYI MultiValueConverter.

То, что вы хотели использовать здесь, было PriorityBinding.Что будет использоваться следующим образом:

<TextBox>
    <TextBox.Text>
        <PriorityBinding>
            <Binding ElementName="SliderExportQuality" Path="Value"/>
            <Binding Path="ExportQuality" UpdateSourceTrigger="PropertyChanged"/>
        </PriorityBinding>
    </TextBox.Text>
</TextBox>

Таким образом, если первое связывание не удастся, второе сработает.

...