2012-03-27 53 views
1

我是WPF數據綁定/樣式/模板的新手... 我想通過使用樣式將一組屬性值應用於按鈕。樣式綁定到類的字段。正如你所看到的,這對BackColor屬性工作正常。但是,當我嘗試設置TextBlock的文本時,它不起作用(我也沒有收到綁定錯誤)。我的最終目標是也能夠將圖像設置爲內容。如何在一個樣式中的WPF DataTemplate中使用綁定

當我不使用DataTemplate並使用SetterProperty =「Content」而不是「ContentTemplate」時,它將適用於一個按鈕,但是當添加第二個按鈕時,它會給我一個運行時錯誤「指定的元素已經是另一個元素的邏輯子元素,首先斷開它。「

我在這裏錯過了什麼?我該怎麼投入「的TextBlock文本=」 ???」

順便說一句,我想樣式移動到全球範圍內,一旦它的作品,所以我不希望使用任何明確指的是MyClass的

<Window.Resources> 
    <Style TargetType="Button" x:Key="MyStyle"> 
     <Setter Property="Background" Value="{Binding BackColor}"/> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="XYZ-"/> 
         <TextBlock Text="{Binding Text}"/> 
        </StackPanel>       
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
<StackPanel Orientation="Horizontal" Height="30"> 
    <Button Style="{StaticResource MyStyle}" DataContext="{Binding Action1}"/> 
    <Button Style="{StaticResource MyStyle}" DataContext="{Binding Action1}"/> 
    <Button Style="{StaticResource MyStyle}" DataContext="{Binding Action2}"/> 
    <Button Style="{StaticResource MyStyle}" DataContext="{Binding Action2}"/> 
</StackPanel> 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = this; 

     Action1 = new MyClass() { Text = "ACTION1", BackColor = new SolidColorBrush(Colors.Red) }; 
     Action2 = new MyClass() { Text = "ACTION2", BackColor = new SolidColorBrush(Colors.Green) }; 
    } 
    public MyClass Action1{get; private set;} 
    public MyClass Action2{get; private set;} 
} 

public class MyClass 
{ 
    public string Text { get; set; } 
    public Brush BackColor { get; set; } 
} 

回答

5

在你原來的問題,你需要

<Setter Property="Background" Value="{Binding BackColor}"/> 
<Setter Property="Content" Value="{Binding Text}"/> 

現在,您需要使用相對源綁定

<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
      AncestorType=Button}, Path=DataContext.Text}"/> 

然而,你可以使用一個ItemsControl如下

的XAML

<Page.Resources> 
    <DataTemplate x:Key="ItemTemplate" DataType="{x:Type Samples:MyClass}"> 
     <Button Background="{Binding BackColor}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="XYZ-"/> 
       <TextBlock Text="{Binding Text}"/> 
      </StackPanel> 
     </Button> 
    </DataTemplate> 
    <ItemsPanelTemplate x:Key="ItemsPanelTemplate"> 
     <StackPanel Orientation="Horizontal"/> 
    </ItemsPanelTemplate> 
</Page.Resources> 
<Page.DataContext> 
    <Samples:DataTemplateItemsControlViewModel/> 
</Page.DataContext> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <ItemsControl 
     ItemsSource="{Binding Items}" 
     ItemsPanel="{StaticResource ItemsPanelTemplate}" 
     ItemTemplate="{StaticResource ItemTemplate}"/> 
</Grid> 

C#

public class DataTemplateItemsControlViewModel 
{ 
    public DataTemplateItemsControlViewModel() 
    { 
     Items = 
      new Collection<MyClass> 
       { 
        new MyClass 
         { 
          Text = "ACTION1", 
          BackColor = new SolidColorBrush(Colors.Red) 
         }, 
        new MyClass 
         { 
          Text = "ACTION2", 
          BackColor = new SolidColorBrush(Colors.Blue) 
         }, 
        new MyClass 
         { 
          Text = "ACTION3", 
          BackColor = new SolidColorBrush(Colors.Green) 
         }, 
        new MyClass 
         { 
          Text = "ACTION4", 
          BackColor = new SolidColorBrush(Colors.Yellow) 
         }, 
       }; 
    } 

    public IList<MyClass> Items { get; private set; } 
} 
+0

謝謝您的回答會更好。是的,這是有效的,但是我需要在內容下面有更多可見的對象。我編輯我的代碼示例來澄清這一點。 – Night94 2012-03-27 19:41:16

+0

我的更新答案有幫助嗎? – Phil 2012-03-30 09:31:18

+0

沒有。使用相對的源代碼綁定產生與我上面的代碼相同的結果。它適用於將樣式應用於一個按鈕,但是對於多個按鈕,我仍然得到相同的異常:「指定的元素已經是另一個元素的邏輯子元素,請先斷開它。 – Night94 2012-03-30 12:41:10

相關問題