Связывание с элементом массива
Я пытаюсь привязать 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] в моем текстовом поле?
Ответы
Ответ 1
Нет необходимости в конвертере. Вы можете напрямую связать с 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}"/>
Ответ 2
ObservableCollection
не распространяются изменения значений, хранящихся в объектах, принадлежащих коллекции. Он только отключает уведомления, когда содержимое самой коллекции изменяется (то есть элемент добавлен, удален, переупорядочен). Если вы хотите сделать так, чтобы ваш пользовательский интерфейс обновлялся, когда значения в коллекции меняются, вам придется подключать их самостоятельно.
Ответ 3
вы можете использовать этот способ в моем случае, я хочу привязать видимость из логического массива:
код позади:
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 зависит от вашего предка в моем случае - это окно