Привязка к статическому свойству

Мне нелегко связывать простое статическое свойство строки с TextBox.

Вот класс со статическим свойством:

public class VersionManager
{
    private static string filterString;

    public static string FilterString
    {
        get { return filterString; }
        set { filterString = value; }
    }
}

В моем xaml я просто хочу связать это статическое свойство с TextBox:

<TextBox>
    <TextBox.Text>
        <Binding Source="{x:Static local:VersionManager.FilterString}"/>
    </TextBox.Text>
</TextBox>

Все компилирует, но во время выполнения, я получаю следующее исключение:

Не может преобразовать значение в атрибуте 'Источник' к объекту типа 'Система. Windows. Разметка. StaticExtension'. Ошибка в объектной 'Системе. Windows. Данные. Привязка' в файле разметки 'BurnDisk; component/selectversionpagefunction.xaml' Строка 57 Положений 29.

Какая-либо идея, что я делаю неправильно?

163
задан ASh 21 October 2019 в 14:45
поделиться

2 ответа

Если привязка должна быть двусторонней, необходимо указать путь. Существует трюк для двусторонней привязки статического свойства при условии, что класс не является статическим: объявить фиктивный экземпляр класса в ресурсах и использовать его как источник привязки.

<Window.Resources>
    <local:VersionManager x:Key="versionManager"/>
</Window.Resources>
...

<TextBox Text="{Binding Source={StaticResource versionManager}, Path=FilterString}"/>
161
ответ дан 23 November 2019 в 21:17
поделиться

Вы не можете привязать такая статика. Там' s нет способа для инфраструктуры привязки получать уведомления об обновлениях, так как не задействован DependencyObject (или экземпляр объекта, реализующий INotifyPropertyChanged ).

Если это значение не изменится, просто избавьтесь от привязки и используйте x: Static непосредственно внутри свойства Text . Определите ниже приложение app как пространство имен (и сборку) класса VersionManager.

<TextBox Text="{x:Static app:VersionManager.FilterString}" />

Если значение действительно изменится, я бы предложил создать одноэлемент, содержащий значение и привязанный к нему.

Пример синглтона:

public class VersionManager : DependencyObject {
    public static readonly DependencyProperty FilterStringProperty =
        DependencyProperty.Register( "FilterString", typeof( string ),
        typeof( VersionManager ), new UIPropertyMetadata( "no version!" ) );
    public string FilterString {
        get { return (string) GetValue( FilterStringProperty ); }
        set { SetValue( FilterStringProperty, value ); }
    }

    public static VersionManager Instance { get; private set; }

    static VersionManager() {
        Instance = new VersionManager();
    }
}
<TextBox Text="{Binding Source={x:Static local:VersionManager.Instance},
                        Path=FilterString}"/>
102
ответ дан 23 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

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