2015-12-29 2 views
0

Я использую Binding + IValueConverter, связанный непосредственно с элементом управления для получения результата, который вычисляется с использованием нескольких свойств элемента управления. Есть ли способ, чтобы конвертер вызывался всякий раз, когда изменяется свойство элемента управления?Binding to Control не обновляется при изменении свойств

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

Пример кода:

MainWindow.xaml

<Window x:Class="BindingToFrameworkElement.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:BindingToFrameworkElement" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
    <local:ElementConverter x:Key="ElementConverter"/> 
    </Window.Resources> 
    <Grid> 
    <TextBlock Text="{Binding ElementName=B, Converter={StaticResource ElementConverter}}"/> 
    <Button Name="B" Click="Button_Click" Width="50" Height="20">Hello</Button> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace BindingToFrameworkElement 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      B.Width += 20; 
     } 
    } 

    public class ElementConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      FrameworkElement element = value as FrameworkElement; 

      return element.ActualWidth + element.ActualHeight; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

ответ

0

Binding к свойствам, до тех пор, как они dependncy свойствами, простое решение, чтобы узнать, что произошло какое-то изменение.
Если вы хотите выйти за пределы границы, вы можете создать прослушиватель свойств зависимостей, а когда свойства спецификаций изменены, отправьте сообщение, используя, например, MVVM Light. Затем поймайте это сообщение везде, где вы хотите обновить некоторые данные на основе измененного DP. Во всяком случае, я бы не советовал вам предпринять такие сложные шаги.

Кстати, вы устанавливаете привязку к Button, а так как кнопка является элементом UI, то в результате конвертер будет вызываться один раз и никогда больше, помните об этом.
Создайте еще одну папку, назовите ее Преобразователи и поместите все классы, которые производят либо IValueConverter, либо IMultiValueConverter. Такой шаг позволяет вам получить четкое разделение и, кроме того, вы не испортите свой код-файл с нерелевантным кодом.

+0

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

Смежные вопросы