为什么这个绑定不能通过XAML工作,而是通过代码工作?

时间:2010-06-08 23:37:03

标签: c# wpf binding static properties

我试图绑定到静态类的静态属性, 此属性包含从文件反序列化的设置。

它永远不适用于以下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 个答案:

答案 0 :(得分:5)

您的代码隐藏不执行绑定,它直接为ComboBox分配源...

如果你想在XAML中做同样的事情,你根本不需要绑定,只需要StaticExtension标记扩展名:

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

(其中local是包含Settings类的命名空间的xmlns映射)

答案 1 :(得分:2)

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"; } }
    }
}

答案 2 :(得分:1)

我找到了答案!

它默默地抛出一个异常被调用的目标抛出我不知道更多......

我正在初始化写入文件的日志;设计人员最终显示了异常的细节,它正在寻找在Visual Program目录中创建文件,该文件位于Program Files中,因此抛出了安全异常。

显然,VS将文件复制到其文件夹中,用于其Designer。

我这样修好了:

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

最后但并非最不重要的是,使用ObjectDataProvider从来没有工作过,只能通过x:Static

这让我几天疯狂,因为绑定数据并不困难;我刚学到了另一课!

答案 3 :(得分:0)

对于ItemsSource,您可以使用直接x:静态赋值,如其他答案所示,但对于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}"   />