我在c#WPF MVC中有一個應用程序。我的目標是創建一個標題欄,併爲我的所有窗口調用它。C#WPF綁定自定義屬性
我創造了這個:
XAML:
<Grid x:Class="Views.TitleBarView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Views"
mc:Ignorable="d"
Style="{DynamicResource TitleStyleGrid}"
x:Name="barView">
<Label x:Name="labelAppName" Style="{DynamicResource TitleStyleLabel}" Content="{Binding Content, ElementName=barView}"/>
<Button x:Name="bttnClose" Style="{DynamicResource ButtonStyleCloseWindow}" Command="{Binding CloseCommand}"/>
</Grid>
C#:
public partial class TitleBarView : Grid
{
static TitleBarView()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(TitleBarView), new FrameworkPropertyMetadata(typeof(TitleBarView)));
}
public readonly static DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(string), typeof(TitleBarView), new PropertyMetadata(""));
public string Content
{
get { return (string)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
public TitleBarView()
{
InitializeComponent();
TitleBarViewModel tvm = new TitleBarViewModel();
tvm.RequestClose += (s, e) => this.Close();
DataContext = tvm;
}
private void Close()
{
Window.GetWindow(this).Close();
}
}
我創建了財產Content
我Grid
和label
內綁定該屬性。所以當我打電話給我的課TitleBarView
我只需要設置屬性「內容」和標籤自動更新。
它的工作原理很好,當我直接將內容與字符串:
<Window [...]
xmlns:local="clr-namespace:VectorReaderV3.Views"
[...]>
<local:TitleBarView x:Name="titleBar" Content="My Title"/>
<Window/>
但隨着綁定,我有一個空標題:
<Window [...]
xmlns:local="clr-namespace:VectorReaderV3.Views"
[...]>
<local:TitleBarView x:Name="titleBar" Content="{Binding WindowTitle}">
<Window/>
我是怎麼做了?
這個'Content =「{Binding WindowTitle}」'從哪裏來? – lokusking
這是爲什麼你永遠不應該顯式設置自定義控件的DataContext的標準示例(就像你在TitleBarView構造函數中那樣)。這樣做有效地避免了繼承一個DataContext,這是你在編寫Content =「{Binding WindowTitle}」時隱含的期望。 – Clemens
我已經學會如此設置DataContext,最好的方法是什麼? –