【问题标题】:WPF UserControl binding failureWPF 用户控件绑定失败
【发布时间】:2015-01-23 16:12:55
【问题描述】:

我偶然发现了一个问题,希望有人能帮我解决它。

我有一个带有一些用户控件的程序集。我想在运行时从该 external 程序集中加载一个 UserControl(稍后对其进行截图而不在屏幕上显示)。

UserControl xaml

<UserControl x:Class="MyAssembly.Test"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Button x:Name="TD1"
                Height="30"
                Width="100"
                Content="{Binding ABC}"/>
    </Grid>
</UserControl>

“视图模型”

public class TestClass : INotifyPropertyChanged
{
    private string _abc = "Initial value";

    public event PropertyChangedEventHandler PropertyChanged;

    public string ABC
    {
        get
        {
            return _abc;
        }
        set
        {
            if (value == _abc)
            {
                return;
            }
            _abc = value;
            OnPropertyChanged1("ABC");
        }
    }

    protected virtual void OnPropertyChanged1(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

让人头疼的一段代码

Assembly.LoadFrom("MyAssembly.dll");
var uri = new Uri(@"/MyAssembly;component/Test.xaml"), UriKind.Relative);
var view = (Control)Application.LoadComponent(uri);
view.Width = 800;
view.Height = 600;
view.RenderSize = new Size(800, 600);
view.Background = Brushes.White;

var viewModel = new TestClass();
view.DataContext = viewModel;
viewModel.ABC = "7";

但是,无论是设置 DataContext 还是更改 ABC 属性 TD1 内容都没有发生变化。它总是保持为空(如果我用调试器查看它)。

如何强制 .Net 根据从外部程序集加载的 xaml 进行绑定(本例中为 ABC)?

【问题讨论】:

  • 它是否只适用于
  • @nbulba 是标准的Button 默认模板吗?如果否并且您设置了Content="ABC",它是否显示ABC
  • @dkozl 是的,如果我离开 Content="ABC" 它会按预期工作,因为实际上不涉及绑定。是的,它是一个标准的 Button。
  • @Blam 不,它不适用于仅文本框。

标签: wpf xaml data-binding user-controls


【解决方案1】:

好的,我找到了使绑定起作用的方法。只需在视图上调用UpdateLayout

Assembly.LoadFrom("MyAssembly.dll");
var uri = new Uri(@"/MyAssembly;component/Test.xaml"), UriKind.Relative);
var view = (Control)Application.LoadComponent(uri);
view.Width = 800;
view.Height = 600;
view.RenderSize = new Size(800, 600);
view.Background = Brushes.White;

var viewModel = new TestClass();
view.DataContext = viewModel;
viewModel.ABC = "7";

view.UpdateLayout();

【讨论】:

    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 2013-06-06
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2012-02-18
    相关资源
    最近更新 更多