我有一个 MainView 窗口,我试图从它的代码隐藏类绑定(bind)它的宽度和高度。
<Window x:Class="RpP25.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:shared="http://schemas.actiprosoftware.com/winfx/xaml/shared"
xmlns:docking="http://schemas.actiprosoftware.com/winfx/xaml/docking"
xmlns:themes="http://schemas.actiprosoftware.com/winfx/xaml/themes"
xmlns:RpWin="clr-namespace:RpP25"
xmlns:RpWinCmds="clr-namespace:RpP25.Commands"
xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
Title="{Binding Path=FileName, Converter={StaticResource WindowTitleNameConverter}}"
Height="{Binding Path=WindowHeight, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
Width="{Binding Path=WindowWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
Icon="images/CobWhite.ico"
Loaded="Window_Loaded"
Closing="Window_Closing">
背后的代码具有属性,并且还通过 ViewModel MainVM 将数据上下文设置为。
public partial class MainView : Window, INotifyPropertyChanged
{
// Constant Fields
private const double windowDefaultWidth_ = 720;
private const double windowDefaultHeight_ = 400;
// Private Fields
private RegistryKey RegKey_; // Registry Key to hold Registry Subkey
private WindowState windowState_ = WindowState.Normal; // Display State of the MainWindow (Min,Max or Normal)
private double windowWidth_ = windowDefaultWidth_; // Width of the MainWindow
private double windowHeight_ = windowDefaultHeight_; // Height of the MainWindow
#region Constructors
public MainView()
{
InitializeComponent();
DataContext = new MainVM();
// Get the state of the window and the width/height from the registry
ReadRegistryValues();
/// <summary>
/// Gets the Width of the Window
/// </summary>
public double WindowWidth
{
get { return windowWidth_; }
set { windowWidth_ = value; NotifyPropertyChanged("WindowWidth"); }
}
/// <summary>
/// Gets the Height of the Window
/// </summary>
public double WindowHeight
{
get { return windowHeight_; }
set { windowHeight_ = value; NotifyPropertyChanged("windowHeight"); }
}
...
}
这个窗口是从 App::OnStartup()
创建的。
当我运行代码时,调试器在输出窗口中抛出以下错误。
Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=WindowHeight; DataItem=null; target element is 'MainView' (Name=''); target property is 'Height' (type 'Double')
WindowWidth
也是类似的。
我以为我了解绑定(bind)模式,但我想我错了:(
我在想,使用 FindAncestor 查找窗口会导致它查找可视化树,直到找到具有我的属性的 MainView 窗口。
如有任何帮助,我们将不胜感激。
最佳答案
尝试
Width="{Binding Path=WindowWidth, RelativeSource={RelativeSource Self}}"
Codebehind 与您的窗口元素相同。所以使用Self binding。
关于c# - 绑定(bind)到 MainView 窗口的 Width 属性时出现绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846522/