Привязка к элементу массива - PullRequest
12 голосов
/ 24 марта 2011

Я пытаюсь привязать TextBlock к определенному элементу в ObservableCollection.Вот что я делаю сейчас:

private ObservableCollection<double> arr = new ObservableCollection<double>();
public ObservableCollection<double> Arr { get { return arr; } set { arr = value; }  }

testBox.DataContext = this;

private void Button_Click(object sender, RoutedEventArgs e)
{
   Arr[0] += 1.0;
}

    [ValueConversion(typeof(ObservableCollection<double>), typeof(String))]
    public class myObsCollConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            ObservableCollection<double> l = value as ObservableCollection<double>;
            if( l == null )
                return DependencyProperty.UnsetValue;
            int i = int.Parse(parameter.ToString());

            return l[i].ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return DependencyProperty.UnsetValue;
        }
    }


    <Window.Resources>
        <local:myObsCollConverter x:Key="myConverter"/>
    </Window.Resources>

        <TextBlock Name="testBox" Text="{Binding Path=Arr,Converter={StaticResource myConverter}, ConverterParameter=0}" />

Я вижу, что testBox показывает первое значение Arr при его создании.Но это не отражает никаких изменений в этом элементе.Что мне нужно сделать, чтобы увидеть изменения в Arr [0] в моем textBox?

Ответы [ 3 ]

22 голосов
/ 24 марта 2011

Нет необходимости в преобразователе. Вы можете привязать непосредственно к Arr[0], как это

 <TextBlock Name="testBox" Text="{Binding Path=Arr[0]}"/>

Элементы в Arr должны реализовывать INotifyPropertyChanged, хотя для динамического обновления.

Обновление : Более подробно:

public class MyDouble : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private double _Value;
    public double Value 
    { 
        get { return _Value; } 
        set { _Value = value; OnPropertyChanged("Value"); }
    }

    void OnPropertyChanged(string propertyName)
    {
       var handler = PropertyChanged;
       if (handler != null)
       {
          handler(this, new PropertyChangedEventArgs(propertyName));
       }
    }
}

, а затем

 ObservableCollection<MyDouble> Arr { get; set; }

и привязка к

 <TextBlock Name="testBox" Text="{Binding Path=Arr[0].Value}"/>
6 голосов
/ 24 марта 2011

ObservableCollection s не распространяют изменения значений, хранящихся в объектах, принадлежащих коллекции.Он запускает уведомления только при изменении содержимого самой коллекции (т. Е. Элемент добавлен, удален, переупорядочен).Если вы хотите сделать так, чтобы ваш пользовательский интерфейс обновлялся при изменении значений в коллекции, вам придется подключить это самостоятельно.

0 голосов
/ 30 августа 2016

вы можете использовать этот способ в моем случае, я хочу связать видимость из логического массива: код позади:

using System.Windows;
public static readonly DependencyProperty ButtonVisibleProperty =
        DependencyProperty.Register("ButtonVisible", typeof(BindingList<Boolean>), typeof(BaseWindow), new PropertyMetadata(new BindingList<Boolean>()));
 public BindingList<Boolean> ButtonVisible 
    { 
        get { return (BindingList<Boolean>)GetValue(BaseWindow.ButtonVisibleProperty); }
        set 
        {
            SetValue(BaseWindow.ButtonVisibleProperty, value);
            OnPropertyChanged("ButtonVisible");  
        } 
    }

и в Xaml:

Visibility=""{Binding Path=ButtonVisible[0], RelativeSource={RelativeSource AncestorType={x:Type Window}}}"

будьте осторожны!ancestorType зависит от вашего предка в моем случае это окно

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