2017-09-03 29 views
0

在WPF項目中,我的viewmodel具有一些我綁定到樣式的常規屬性。然後我想在DataTemplate中使用該樣式,在該模型中綁定來自viewmodel的集合。如何在DataTemplate中使用窗口級數據綁定樣式

數據綁定樣式按照預期在DataTemplate外部工作,但不適用於裏面。調試時,我可以看到它正在尋找集合對象內的常規屬性,所以我的問題是,我如何在DataTemplate中獲取視圖模型中的屬性。我想我必須使用RelativeSource綁定,但我一直無法使它工作。

這種快速的應用程序應該表現出什麼,我試圖做的:

MainWindow.xaml

<Window x:Class="StyleTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:StyleTest" 
     mc:Ignorable="d" 
     Title="Test" 
     SizeToContent="WidthAndHeight"> 
    <Window.Resources> 
     <Style TargetType="TextBlock" x:Key="Header"> 
      <Setter Property="FontSize" Value="{Binding FontSize}" /> 
      <Setter Property="Foreground" Value="{Binding Foreground}" /> 
     </Style> 
     <DataTemplate x:Key="UserTemplate"> 
      <StackPanel> 
       <TextBlock Style="{StaticResource Header}" Text="{Binding Name}" /> 
      </StackPanel> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid Margin="20"> 
     <StackPanel> 
      <ItemsControl Name="Itemscontrol" ItemsSource="{Binding Users}" ItemTemplate="{StaticResource UserTemplate}" /> 
      <TextBlock Style="{StaticResource Header}">Style this.</TextBlock> 
     </StackPanel> 
    </Grid> 
</Window> 

MainWindow.cs

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Media; 

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

      Model m = new Model { 
       FontSize = 28, 
       Foreground = new SolidColorBrush(Colors.Orange), 
       Users = new List<User>() }; 

      m.Users.Add(new User() { Name = "Mambo No. 1" }); 
      m.Users.Add(new User() { Name = "Right Hand Rob" }); 
      m.Users.Add(new User() { Name = "Perry Junior" }); 

      this.DataContext = m; 
     } 
    } 

    public class Model 
    { 
     private int fontSize; 
     public int FontSize { get => fontSize; set => fontSize = value; } 

     private SolidColorBrush foreground; 
     public SolidColorBrush Foreground { get => foreground; set => foreground = value; } 

     private List<User> users; 
     public List<User> Users { get => users; set => users = value; } 
    } 

    public class User 
    { 
     public string Name { get; set; } 
    } 
} 
+0

sTrenat's solution works per fect(謝謝),我在嘗試讓RelativeSource綁定工作時錯過了正確的綁定路徑。 – tkrag

回答

1

我想你想是這樣的:

<Style TargetType="TextBlock" x:Key="Header"> 
    <Setter Property="FontSize" Value="{Binding Path=DataContext.FontSize, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 
    <Setter Property="Foreground" Value="{Binding Path=DataContext.Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 
</Style> 
相關問題