当前位置: 首页 > 知识库问答 >
问题:

GridViewColumn.CellTemplate的DataTemplate内的WPF绑定UserControl属性

谭曦
2023-03-14
<ListView Margin="10" x:Name="lvHistory">
                <ListView.Resources>
                    <Style TargetType="{x:Type GridViewColumnHeader}">
                        <Setter Property="HorizontalContentAlignment" Value="Left" />
                    </Style>
                </ListView.Resources>
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="Database" Width="150" DisplayMemberBinding="{Binding ActiveBackup.Database.Name, Mode=TwoWay}"  />
                        <GridViewColumn Header="Start Time" Width="130" DisplayMemberBinding="{Binding ActiveBackup.StartTime, Mode=TwoWay}" />
                        <GridViewColumn Header="Time Elapsed" Width="100" DisplayMemberBinding="{Binding ActiveBackup.TimeElapsed, Mode=TwoWay}" />
                        <GridViewColumn Header="P2" Width="100" DisplayMemberBinding="{Binding Progress, Mode=TwoWay}" />
                        <GridViewColumn x:Name="progressColumn" Header="Progress" Width="150">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <local:cProgressBarSmall x:Name="pr1" Value="{Binding Progress, Mode=TwoWay}" Visibility="Visible" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>
public partial class cProgressBarSmall : UserControl
    {
        public ActiveBackup ActiveBackup { get; set; }

        public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(decimal), typeof(cProgressBarSmall));

        private decimal _value;
        public decimal Value
        {
            get
            {
                return (decimal) GetValue(ValueProperty);
            }
            set
            {
                _value = value;
                SetValue(ValueProperty, value);
                p1.Value = value.ToDoubleNotNull();
                pLabel.Text = value.ToPercent(0);
                if (value == 0)
                {
                    p1.Visibility = Visibility.Hidden;
                    pLabel.Visibility = Visibility.Hidden;
                }
                else if (value.ToDoubleNotNull() >= p1.Maximum)
                {
                    pLabel.Text = "Finished!";
                    pLabel.Foreground = new SolidColorBrush(Colors.Black);
                }
            }
        }
    }
}

我找不到访问“PR1”的方法,因为它在DataTemplate中,因此不能直接从代码隐藏中访问。绑定不能通过吗?它之前的列(“P2”列)就在test列上,我放入该列只是为了确保该值确实在更新,并且正确显示,但是“ProgressColumn”总是只显示默认值。

在ListView.View>GridView>GridViewColumn>GridViewColumn.CellTemplate>DataTemplate层次结构中的数据绑定有什么特殊之处吗?

共有1个答案

洪楷
2023-03-14

首先,如果在setter中放置断点,您会发现绑定没有命中断点。这是因为绑定设置的是dependency属性,而不是C#属性。他们不一样。带有get/set的C#属性是dependency属性的可选包装器。

正确的方法是很少或没有代码隐藏(代码隐藏并不邪恶;您只是不需要任何代码隐藏),而是使用usercontrol xaml中的绑定来更新UI。可以使用usercontrol XAML中的样式触发器隐藏和显示控件以及更新标签文本。您不需要任何代码。

但是这里有一个最简单的方法来使现有的代码适应一些工作。

    public decimal Value
    {
        get { return (decimal)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public static readonly DependencyProperty ValueProperty = 
        DependencyProperty.Register("Value", typeof(decimal), typeof(cProgressBarSmall), 
            new PropertyMetadata(0m, Value_ChangedCallback));

    //  Has to be static
    private static void Value_ChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((cProgressBarSmall)d).OnValueChanged();
    }

    private void OnValueChanged()
    {
        p1.Value = Value.ToDoubleNotNull();
        pLabel.Text = Value.ToPercent(0);
        if (Value == 0)
        {
            p1.Visibility = Visibility.Hidden;
            pLabel.Visibility = Visibility.Hidden;
        }
        else if (Value.ToDoubleNotNull() >= p1.Maximum)
        {
            pLabel.Text = "Finished!";
            pLabel.Foreground = new SolidColorBrush(Colors.Black);
        }
    }
 类似资料:
  • 最好的办法是什么?根据显示的数据,我希望绑定到MyText1或MyText2。我怎么做“开关”?

  • 如何通过绑定隐藏 WPF 中的列? 这就是我所做的: 这是我得到的(除了仍然可见的列): System. Windows. Data错误:2:找不到目标元素的管理Frameworks Element或Frameworks ContentElement。绑定表达式:路径=My列可见性;数据项=空;目标元素是“DataG的文本列”(HashCode=1460142);目标属性是“可见性”(类型“可见性

  • 我在这里遇到了TreeView绑定和ContextMenu的问题:Selected TreeView项为空 现在我有这个问题:我有ContextMenu (图片显示了我的ContextMenu的样子,不要介意tabItem...)。 正如你所看到的,它只是ContetMenu,没有MenuItem!如果用户单击“关闭”,我想在ViewModel中执行一些操作(发出命令?)。我还想知道他点了哪个按钮

  • 我有一个包含文本框的DataTemplate。DataTemplate绑定到DevExpress FlyoutControl样式的ContentTemplate属性。Flyout控件本身位于另一个TextBox的ControlTemplate中。 ... 飞出正在用代码打开。在这里,我还想聚焦文本框(TextThatWantsFocus)。然而,我尝试过的任何东西都不会给它带来焦点(除了Focus