wpf 如何在HwndHost中调用BuildWindowCore方法之前使绑定生效

js5cn81o  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(157)

我有一个WPF项目,我想启动多个程序,并将它们嵌入到我的应用程序。我有一个继承自HwndHost并实现BuildWindowCore抽象方法的类。我还注册了一个名为FileName的依赖项属性,希望通过绑定动态指定要启动的程序。下面是ListBox的代码:

<ListBox ItemsSource="{Binding Datas}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border>
                <local:PowerHwndHost FileName="{Binding Path}"/>
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

下面是继承自HwndHost的类的代码:

public class PowerHwndHost : HwndHost
{
    public string FileName
    {
        get { return (string)GetValue(FileNameProperty); }
        set { SetValue(FileNameProperty, value); }
    }

    public static readonly DependencyProperty FileNameProperty =
        DependencyProperty.Register("FileName", typeof(string), typeof(PowerHwndHost), new PropertyMetadata(""));

    protected override HandleRef BuildWindowCore(HandleRef hwndParent)
    {
        //dosomething
    }

    protected override void DestroyWindowCore(HandleRef hwnd)
    {
        //dosomething
    }
}

下面是视图模型的代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel();
    }
}

public class MainViewModel
{
    public ObservableCollection<Data> Datas { get; set; }

    public MainViewModel()
    {
        Datas = new()
        {
            new Data(){Path="D:/example.exe"},
            new Data(){Path="D:/example2.exe"}
        };
    }
}

public class Data
{
    public string Path { get; set; } = "";
}

我尝试通过绑定动态指定要启动的程序。我希望在调用BuildWindowCore方法时,FileName属性已经绑定到正确的值。然而,实际上,当调用BuildWindowCore方法时,绑定甚至还没有生效。我无法获取FileName绑定的值,这导致BuildWindowCore无法正常工作。

jdgnovmf

jdgnovmf1#

我发现,即使绑定尚未激活,也可以手动从DataContext获取数据

相关问题