Объекты привязки, определенные в коде - позади

Существует две статьи о CodeProject, которые обеспечивают код для решения, то, которое использует StreamReader и тот что данные CSV импорта использование текстовый Драйвер .

Microsoft

80
задан abatishchev 20 April 2012 в 09:28
поделиться

5 ответов

Вы можете установить DataContext для вашего элемента управления, формы, и т. д., например:

DataContext="{Binding RelativeSource={RelativeSource Self}}"

Пояснение :

Контекст данных, устанавливаемый на значение выше, должен выполняться в том элементе, который "владеет" кодом позади - поэтому для окна вы должны установить его в Объявление окна.

У меня есть ваш пример, работающий с этим кодом:

<Window x:Class="MyClass"
  Title="{Binding windowname}"
  DataContext="{Binding RelativeSource={RelativeSource Self}}"
  Height="470" Width="626">

Контекст данных, установленный на этом уровне, затем наследуется любым элементом в окне (если вы явно не измените его для дочернего элемента),

100
ответ дан 24 November 2019 в 09:45
поделиться

Define a converter:

public class RowIndexConverter : IValueConverter
{
    public object Convert( object value, Type targetType,
                           object parameter, CultureInfo culture )
    {
        var row = (IDictionary<string, object>) value;
        var key = (string) parameter;
        return row.Keys.Contains( key ) ? row[ key ] : null;
    }

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

Bind to a custom definition of a Dictionary. There's lot of overrides that I've omitted, but the indexer is the important one, because it emits the property changed event when the value is changed. This is required for source to target binding.

public class BindableRow : INotifyPropertyChanged, IDictionary<string, object>
{
    private Dictionary<string, object> _data = new Dictionary<string, object>( );

    public object Dummy   // Provides a dummy property for the column to bind to
    {
        get
        {
            return this;
        }
        set
        {
            var o = value;
        }
    }


    public object this[ string index ]
    {
        get
        {
            return _data[ index ];
        }
        set
        {
            _data[ index ] = value;
            InvokePropertyChanged( new PropertyChangedEventArgs( "Dummy" ) ); // Trigger update
        }
    }


}

In your .xaml file use this converter. First reference it:

<UserControl.Resources>
    <ViewModelHelpers:RowIndexConverter x:Key="RowIndexConverter"/>
</UserControl.Resources>

Then, for instance, if your dictionary has an entry where the key is "Name", then to bind to it: use

<TextBlock  Text="{Binding Dummy, Converter={StaticResource RowIndexConverter}, ConverterParameter=Name}">
1
ответ дан 24 November 2019 в 09:45
поделиться

Make your property "windowname" a DependencyProperty and keep the remaining same.

1
ответ дан 24 November 2019 в 09:45
поделиться

В коде позади установите DataContext окна в словарь. В вашем XAML вы можете написать:

<ListView ItemsSource="{Binding}" />

Это свяжет ListView со словарем.

Для более сложных сценариев это будет подмножество методов, лежащих в основе шаблона MVVM .

0
ответ дан 24 November 2019 в 09:45
поделиться

Один из способов - создать ObservableCollection (System.Collections.ObjectModel) и разместить там данные вашего словаря. Затем вы сможете привязать ObservableCollection к вашему ListBox.

В вашем XAML должно быть что-то вроде этого:

<ListBox ItemsSource="{Binding Path=Name_of_your_ObservableCollection" />
0
ответ дан 24 November 2019 в 09:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: