Почему эта привязка не работает через XAML, а работает по коду? - PullRequest
1 голос
/ 09 июня 2010

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

Он никогда не работает со следующим XAML:

    <Window.Resources>
    <ObjectDataProvider x:Key="wrapper" ObjectType="{x:Type Application:Wrapper}"/>
</Window.Resources>

<ScrollViewer x:Name="scrollViewer" ScrollViewer.VerticalScrollBarVisibility="Auto"DataContext="{Binding Source={StaticResource wrapper}, UpdateSourceTrigger=PropertyChanged}">

   <ComboBox x:Name="comboboxThemes"
                  SelectedIndex="0"
                  SelectionChanged="ComboBoxThemesSelectionChanged"
                  Grid.Column="1"
                  Grid.Row="8"
                  Margin="4,3" ItemsSource="{Binding Settings.Themes, Mode=OneWay}" SelectedValue="{Binding Settings.LastTheme, Mode=TwoWay}"   />

Это работает по коду, однако:

comboboxThemes.ItemsSource = Settings.Themes;

Есть идеи?

Спасибо: -)

Ответы [ 4 ]

5 голосов
/ 09 июня 2010

Ваш программный код не выполняет привязку, он напрямую назначает источник для ComboBox ...

Если вы хотите сделать то же самое в XAML, вам вообще не нужна привязка, вам просто нужно расширение разметки StaticExtension:

ItemsSource="{x:Static local:Settings.Themes}"

(где local - отображение xmlns для пространства имен, содержащего класс Settings)

2 голосов
/ 09 июня 2010

XAML:

<Window x:Class="StaticTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:StaticTest="clr-namespace:StaticTest"
    Height="300" Width="300">
    <StackPanel>
        <TextBlock Text="{x:Static StaticTest:MyStaticStuff.MyProp}" />
    </StackPanel>
</Window>

Код:

namespace StaticTest
{
    public static class MyStaticStuff
    {
        public static string MyProp { get { return "From static"; } }
    }
}
1 голос
/ 10 июня 2010

Я нашел ответы!

Он молча выбросил Исключение было сгенерировано целью вызова Я не знал больше ...

Я инициализировал журнал, который пишет в файл;наконец, дизайнер раскрыл подробности исключения, он искал файл в каталоге Visual Studio, который находится в Program Files, и, следовательно, было сгенерировано исключение безопасности.

Очевидно, VS копирует файл в свою папку,для его Designer.

Я исправил это так:

 var isInDesignMode = DesignerProperties.GetIsInDesignMode(SettingsWindow);
        if (!isInDesignMode)
        {
            Log = new WrapperLogManager("log_wrapper.txt");
        }

Последнее, но не менее важное, использование ObjectDataProvider никогда не работало так же хорошо, только через x: Static

Это былосводить меня с ума на несколько дней, поскольку связать данные не так сложно;Я только что выучил еще один урок!

0 голосов
/ 09 июня 2010

Для ItemsSource вы можете использовать прямое назначение x: Static, как показано в других ответах, но для SelectedValue вам требуется Binding, для которого требуется экземпляр, для которого нужно установить свойство. Вы должны иметь возможность реструктурировать статический класс в Singleton, чтобы обеспечить привязываемый экземпляр и свойство, на которое все еще можно статически ссылаться из кода, что-то вроде:

public class Settings : INotifyPropertyChanged
{
    public static Settings Instance { get; private set; }

    public static IEnumerable<string> Themes { get; set; }

    private string _lastTheme;
    public string LastTheme
    {
        get { return _lastTheme; }
        set
        {
            if (_lastTheme == value)
                return;
            _lastTheme = value;
            PropertyChanged(this, new PropertyChangedEventArgs("LastTheme"));
        }
    }

    static Settings()
    {
        Themes = new ObservableCollection<string> { "One", "Two", "Three", "Four", "Five" };
        Instance = new Settings();
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Тогда ComboBox будет использовать эти привязки:

<ComboBox ItemsSource="{x:Static local:Settings.Themes}"
SelectedValue="{Binding Source={x:Static local:Settings.Instance}, Path=LastTheme}"   />
...