Это не C. Это C#. C# является объектно-ориентированным. Привязка к массиву связанных значений не является хорошей идеей по многим причинам. Вместо этого связывайте с объектом, который инкапсулирует связанные значения массива.
Вместо привязки к словарю массивов, вы должны привязать к коллекции объектов. Для этого вам необходимо преобразовать массив в класс, который реализует INotifyPropertyChanged
.
Каждое поле массива становится свойством класса. Вы должны применить этот рефакторинг ко всем вашим Binding.Source
, где источником является массив значений. В конце вы сможете привязать только к спискам.
Избегайте привязывания элементов управления к словарям или массивам.
Это простой пример использования объектов (моделей данных) для заполнения ListView
и изменения содержимого ячейки GridView
(Image
) на основе значения свойства SimpleDataObject.IsActive
модели данных SimpleDataObject
:
SimpleDataObject.cs
class SimpleDataObject : INotifyPropertyChaged
{
// Constructor
public SimpleDataObject(string data) => this.DataValue = data;
private bool isActive;
public bool IsActive
{
get => this.isActive;
set
{
this.isActive = value;
OnPropertyChanged();
}
}
private string dataValue;
public string DataValue
{
get => this.dataValue;
set
{
this.dataValue = value;
OnPropertyChanged();
}
}
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
ViewModel. cs
// Binding source
class ViewModel : INotifyPropertyChaged
{
public ViewModel()
{
this.SimpleDataObjects = new ObservableCollection<SimpleDataObject>()
{
new SimpleDataObject("Data value 1"),
new SimpleDataObject("Data value 2"),
new SimpleDataObject("Data value 3")
}
}
public ObservableCollection<SimpleDataObject> SimpleDataObjects { get; set; }
}
MainWindow.xaml.cs
partial class MainWindow : Window
{
private void OnImageMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var image = sender as Image;
var dataItem = image.DataContext as SimpleDataObject;
dataItem.IsActive = true; // Toggle image
}
}
MainWindow.xaml
<Window>
<Window.DataContext>
<ViewModel />
</Window.DataContext>
<ListView ItemsSource="{Binding SimpleDataObjects}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Functions">
<GridViewColumn.CellTemplate>
<DataTemplate DataType="{x:Type SimpleDataObject}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding DataValue}"/>
<Image MouseLeftButtonUp="OnImageMouseLeftButtonUp">
<Image.Style>
<Style TargetType="Image">
<!-- Default value. Applies when the observed property IsActive returns false -->
<Setter Property="Source" Value="pack://application:,,,/Resources/right_arrow.png" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsActive}" Value="True">
<Setter Property="Source" Value="pack://application:,,,/Resources/x.ico" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</Window>