2011-06-10 134 views
0

考虑下面的XAML代码:WPF绑定通过StaticResouces

<Window.Resources> 
    <System:String x:Key="StringValue"></System:String> 
</Window.Resources> 
    <Grid> 
     <ComboBox Margin="137,101,169,183" ItemsSource="{Binding collection}" SnapsToDevicePixels="True" IsHitTestVisible="true"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
       <CheckBox Command="{Binding CheckCommand}" IsChecked="{Binding IsChecked}" Content="{Binding Name}"/> 
        <TextBlock Text="{StaticResource StringValue}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
</Grid> 

我想是的文本块文本绑定到一个静态的资源,一个数据绑定到视图模型的值。问题是System.String似乎不允许数据绑定。任何人都知道如何做到这一点?对于上下文来说,TextBlock需要一个不同于其父组合框的itemSource。

谢谢。

+0

你有别名** ** mscorlib程序? 'xmlns:System =“clr-namespace:System; assembly = mscorlib”'没有错误出现。 – 2011-06-10 08:37:24

+0

是的,弦乐很好。 – 2011-06-10 08:37:58

+0

看看我编辑一个可能的包装类,它允许检测字符串的更新 – fixagon 2011-06-10 09:17:05

回答

0

要澄清,A System.String没有依赖项属性,所以你不能绑定任何东西。我认为你需要一个转换器,以便你的TextBlock可以绑定到视图模型。你有什么类型的ObservableCollection视图模型?

编辑如果你只是想简单的字符串绑定到文本属性这是错误的答案。如果你想绑定到格式化文本,请继续阅读。

我以前有这个问题。我想将我的TextBlock绑定到我的属性中的字符串资源。我最终将TextBlock分类为BindableTextBlock,并将string的转换器转换为Inline列表。

Question and Answers here.

它可能看起来有点棘手,就必须有一个更简单的方法。但是,无论何时我需要绑定到某些格式化的文本并且它可以正常工作,我都会多次使用该控件。希望你能从我的工作中受益,并且可能会有所改进。

2

字符串犯规允许绑定,因为它不是一个DependencyObject的(和犯规执行INotifyPropertyChanged)

,但你为什么不只是直接绑定到视图模型的价值?

,如果你不能绑定到视图模型(想想的RelativeSource与搜索父类),你可以实现一个包装(它实现INotifyPropertyChanged得到的对象的变化)

例包装类:

public class BindWrapper<T> : INotifyPropertyChanged 
{ 
    private T _Content; 
    public T Content 
    { 
     get 
     { 
      return _Content; 
     } 
     set 
     { 
      _Content = value; 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs("Content")); 
     } 
    } 


    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

如何实例化和XAML绑定:

<Window.Resources> 
    <local:BindWrapper x:Key="wrapper" x:TypeArguments="System:String"> 
     <local:BindWrapper.Content> 
      <System:String>huuu</System:String> 
     </local:BindWrapper.Content> 
    </local:BindWrapper> 
</Window.Resources> 
<TextBlock Text="{Binding Source={StaticResource wrapper}, Path=Content}" /> 
+0

我不能直接绑定到值,因为文本块父(组合框)具有VM内可观察集合的项目源。它不会允许我从中分离Textblock。 – 2011-06-10 08:41:53

+0

@Darren Young,是ObservableCollection 或ObservableCollection 还是别的? – Jodrell 2011-06-10 08:45:51