gpt4 book ai didi

c# - 我究竟做错了什么?具有数据绑定(bind)的自定义用户控件内的依赖属性

转载 作者:行者123 更新时间:2023-11-30 16:25:33 25 4
gpt4 key购买 nike

(已编辑以修复 DP 的语法错误 - 但问题仍然存在)

我在将数据绑定(bind)到简单的自定义用户控件中的依赖属性时遇到了一些问题,想知道你们中的一些专家是否可以告诉我哪里出错了。

基本上,在我的用户控件中,我有一个标签和两个按钮。该标签绑定(bind)到我的依赖属性,当您单击按钮时,计数会根据按钮的点击次数增加或减少,然后由标签显示。

如果我在没有用户控件的情况下在页面内执行所有这些操作,则一切都可以正常工作。但是,一旦我将它移至用户控件,它就会开始表现得很奇怪。初始计数 0 按预期显示在开始时,当我单击按钮时,修改后的计数显示在第一次单击时。但是,如果我再次单击同一个按钮,依赖属性会更新,但不会显示该值(标签变为空白)。如果我点击另一个按钮,则会显示修改后的计数,但只是第一次点击 - 这一切都很奇怪,我被卡住了!

如果我在“TheCountProperty_Changed”方法上放置断点,我可以验证属性值是否得到正确更新。

这是我的自定义控件的 XAML:

<UserControl
x:Class="DPTest.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:DPTest"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400"
x:Name="TestControl"
x:Uid="TestControl">

<Grid>
<TextBlock x:Name="lblCount" HorizontalAlignment="Left" Margin="0,0,0,0" TextWrapping="Wrap" Text="{Binding Path=TheCount, ElementName=TestControl, Mode=OneWay}" VerticalAlignment="Top" FontSize="36"/>
<Button x:Name="btnLess" Content="&lt;" HorizontalAlignment="Left" Margin="0,71,0,0" VerticalAlignment="Top" Width="75" Click="btnLess_Click" ClickMode="Press"/>
<Button x:Name="btnMore" Content="&gt;" HorizontalAlignment="Left" Margin="91,71,0,0" VerticalAlignment="Top" Width="75" Click="btnMore_Click" ClickMode="Press"/>

</Grid>

这是它的 CS:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace DPTest
{
public sealed partial class UserControl1 : UserControl
{
public static readonly DependencyProperty TheCountProperty = DependencyProperty.Register("TheCount", typeof(int), typeof(UserControl1), new PropertyMetadata(0, new PropertyChangedCallback(TheCountProperty_Changed)));

public int TheCount
{
get { return (int)GetValue(TheCountProperty); }
set { SetValue(TheCountProperty, value); }
}
private static void TheCountProperty_Changed(DependencyObject source, DependencyPropertyChangedEventArgs e)
{

}

public UserControl1()
{
this.InitializeComponent();
}

private void btnLess_Click(object sender, RoutedEventArgs e)
{
//lblCount.Text = (Convert.ToInt32(lblCount.Text) - 1).ToString();
this.TheCount -= 1;
}

private void btnMore_Click(object sender, RoutedEventArgs e)
{
//lblCount.Text = (Convert.ToInt32(lblCount.Text) + 1).ToString();
this.TheCount += 1;
}
}
}

我假设我的数据绑定(bind)语法有点不正确,但它应该是什么?

(编辑)- 情节变厚了!想补充一点,我刚刚在标准 WPF 应用程序中尝试了完全相同的语法,一切都按预期工作。所以我想问题是,我是否发现了 WinRT/XAML 的错误,或者使用该平台的语法是否不同?

(编辑 #2 对所有编辑感到抱歉,但我仍在努力解决这个问题!)我开始相信这是按钮控件的显示问题或错误。我刚刚添加了一个额外的按钮,但没有为它或任何东西连接任何点击事件代码——它基本上只是一个什么都不做的按钮。有趣的是:

  • 如果我启动测试应用程序,单击 btnMore 按钮,然后 TheCount 会递增,Textblock 会按预期更新。如果我再次单击同一个按钮,TheCount 会增加,但 lblCount 的文本值变为空字符串。
  • 但是,如果我启动测试应用程序并按 btnMore,然后按未使用的按钮,并不断重复该操作,则值会不断增加,TextBlock 将不断更新 - 只要我不按 btnMore 两次行,但按下空白按钮(或者实际上只是将光标聚焦到空白文本框或任何其他 UI 事物),然后 TextBlock 将继续显示递增的数字。第二次我多次单击 btnMore,然后 lblCount 的值变为空字符串。

这很奇怪....

最佳答案

DependencyProperty 的第三个参数看起来应该是“UserControl1”而不是“UserControl”。

在启动 Win 8 并亲自尝试代码后,我发现了与您遇到的相同问题。

据此我可以确定两件事:

1) 你的依赖属性基本正确。当单击按钮时,我可以观察到属性值的增加和减少。这向我表明问题是某种刷新问题。

2) 将代码从 UserControl 移动到主 xaml 页面(在我的测试应用程序中,它是默认的“Blank.xaml”页面)允许正确刷新数字。

在我看来,测试版(错误..'消费者预览')存在某种刷新错误,您可以通过稍微不同地构建您的应用程序来解决此问题。

关于c# - 我究竟做错了什么?具有数据绑定(bind)的自定义用户控件内的依赖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761646/

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