gpt4 book ai didi

wpf - OneWayToSource 困境

转载 作者:行者123 更新时间:2023-12-02 05:33:34 26 4
gpt4 key购买 nike

我正在使用 OneWayToSource绑定(bind),它似乎总是将我的源属性设置为空。为什么呢?这给我带来了麻烦,因为我需要源属性中目标属性的值而不是空值。

这是我的代码:

MyViewModel.cs:

public class MyViewModel
{
private string str;

public string Txt
{
get { return this.str; }
set { this.str = value; }
}
}

MainWindow.cs:
public MainWindow()
{
InitializeComponent();
MyViewModel vm = new MyViewModel();
vm.Txt = "123";
this.DataContext = vm;
}

MainWindow.xaml:
<Window x:Class="OneWayToSourceTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:OneWayToSourceTest">
<Grid>
<local:MyButton Content="{Binding Path=Txt, Mode=OneWayToSource}"/>
</Grid>
</Window>

MyButton.cs:
public class MyButton : Button
{
public MyButton()
{
this.Content = "765";
}
}

目标属性是 MyButton.Content .源属性是 MyViewModel.Txt . Txt属性应设置为“765”,但它为空。

为什么我收到 null 而不是 765?

编辑:

请看里面 MyButton构造函数。实际上,如果您使用简单的 TwoWay它会起作用的。我对其进行了测试,它与在构造函数中设置的内容无关。它的东西与 OneWayToSource绑定(bind)我猜。

现在解释一下我是如何使用 TwoWay的绑定(bind),我确实通过调用 setvalue 在构造函数中设置了 dp 的值方法,但是在包装器内部或更确切地说是getter和setter,我没有提供任何setter,因此我制作了我的 TwoWay有点像它的 OneWayToSource .我这样做是为了测试它的构造函数是否出错。我认为 viewmodel 中的属性值为 765,所以这就是我所说的 TwoWay。捆绑。我只是测试了它是否是控制构造函数。在构造函数中设置一个值就可以了。

通过隐藏二传手我的意思是这个
设置{}

最佳答案

Content属性只能设置为单个值,并且您正在将值“756”替换为绑定(bind)。

正如我在 my answer 中向您指出的那样对于您的其他问题,WPF 按以下顺序运行代码:

  • 正常 - 构造函数在这里运行
  • 数据绑定(bind)
  • 渲染
  • 已加载

  • 所以要做的第一件事就是你的 MainWindow构造函数运行。这将创建按钮,它调用按钮的构造函数,并设置 Button.Content到“765”。

    但是在 XAML 中为 Button ,您指定了不同的 Content属性 - 绑定(bind)。所以你的按钮对象被创建了, Content属性设置为“765”,然后 Content属性设置为 {Binding Path=Txt, Mode=OneWayToSource} .

    这与执行以下操作相同:
    var b = new MyButton();
    b.Content = "756";
    b.Content = new Binding(...);

    您正在替换 Content属性(property)。

    (从技术上讲,最后一行应该是 b.SetBinding(MyButton.ContentProperty, new Binding(...)); 以正确绑定(bind)值,但是我使用了更基本的语法来更容易理解问题。)

    循环中的下一步是数据绑定(bind),因此 Content 上的绑定(bind)属性被评估。

    因为它是 OneWayToSource绑定(bind),该属性仅在源元素发生更改时更新它,并且由于这是第一次评估绑定(bind),因此它将源设置为此 DependencyProperty 的默认值。所以他们是同步的。

    Button.Content 的情况下依赖属性,默认值为 null ,因此您的源元素设置为 null .
    TwoWay 看不到这种行为绑定(bind),因为 DP 从绑定(bind)中获取它的值,而不是使用默认值。

    如果您要在设置绑定(bind)后设置值,例如在 Loaded 中按钮的事件,当您设置按钮的 Content 时,您会看到源属性正确更新
    void MyButton_Loaded(object sender, EventArgs e)
    {
    ((Button)sender).Content = "756";
    }

    最后,如果您尝试设置 Content 的默认值自定义控件中的属性,您需要覆盖 MetaData对于该属性,如下所示:
    // Note that this is the static constructor, not the normal one
    static MyButton()
    {
    ContentProperty.OverrideMetadata(typeof(MyButton),
    new FrameworkPropertyMetadata("756"));
    }

    这将使它成为 Content 的默认值属性是 "756"而不是 null

    关于wpf - OneWayToSource 困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16279890/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com