【问题标题】:How to bind wpf UserControl?如何绑定 wpf 用户控件?
【发布时间】:2018-10-12 17:02:38
【问题描述】:

我在将视图模型绑定到我创建的用户控件时遇到问题。视图模型不反映值的变化。

UpDown.xaml(用户控件 xaml 部分) btnUp 和 btnDown 用于更改 txtNum 的文本。不知道对不对?

<Grid DataContext="{Binding ElementName=btnDownRoot}">
    <Grid.RowDefinitions>
        <RowDefinition Height="0*"/>
        <RowDefinition/>
        <RowDefinition Height="0*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0*"/>
        <ColumnDefinition Width="78*"/>
        <ColumnDefinition Width="104*"/>
        <ColumnDefinition Width="77*"/>
        <ColumnDefinition Width="0*"/>
    </Grid.ColumnDefinitions>
    <TextBox Name="txtNum" Text="{Binding ElementName=btnDownRoot, Path=NumValue}" FontSize="20" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" BorderBrush="White" Grid.Column="2" Grid.RowSpan="2"/>
    <Button Name="btnUp" Style="{StaticResource ResourceKey=btnUp}" Click="btnUp_Click" Grid.Column="3" Grid.RowSpan="2"/>
    <Button Name="btnDown" Style="{StaticResource ResourceKey=btnDown}" Click="btnDown_Click" Grid.RowSpan="2" Grid.ColumnSpan="2"/>
</Grid>

UpDown.xaml.cs(用户控件代码部分)

    public string NumValue
    {
        get
        {

            return GetValue(NumValueProperty).ToString();
        }
        set
        {

            SetValue(NumValueProperty, value);
        }
    }

    public static readonly DependencyProperty NumValueProperty =
        DependencyProperty.Register("NumValue", typeof(string), typeof(UpDown), 
            new PropertyMetadata("1", new PropertyChangedCallback(OnNumChanged)));

    private static void OnNumChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
    {
        var instannce = d.ToString();
    }

在MainWindow中,我将MainViewModel绑定到UserControl MainViewModel.cs

public class MainViewModel: BaseViewModel
{
    private string _myValue;
    public string MyValue
    {
        get { return _myValue; }
        set
        {
            _myValue = value;
            OnPropertyChanged("MyValue");

        }
    }
}

MainWindow.xaml

<Window.DataContext>
    <local:MainViewModel/>
</Window.DataContext>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <local:UpDown Grid.Row="0" NumValue="{Binding MyValue}" x:Name="udGuestNum"  Width="220"  Margin="0 20"/>
    <Button Name="btnOK" Grid.Row="1" Content="OK" Click="btnOK_Click"/>
</Grid>

【问题讨论】:

  • 能否也显示正在更改值的代码?
  • 您应该将绑定设置为TwoWay 模式。
  • TwoWay 是默认模型吗?

标签: wpf binding


【解决方案1】:

NumValue 绑定默认为 OneWay。要么明确地将其设置为 TwoWay

NumValue="{Binding MyValue, Mode=TwoWay}" 

或将 TwoWay 设为默认值:

public static readonly DependencyProperty NumValueProperty =
    DependencyProperty.Register(
        "NumValue", typeof(string), typeof(UpDown),
        new FrameworkPropertyMetadata(
            "1", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnNumChanged));

【讨论】:

  • 谢谢!我只能获取初始值,但是当我更改“txtNum”文本框时,无法检索到新值。
  • btnDownRoot 是其 XAML 中 UserControl 实例的名称吗?当您在 TextBox 中键入文本时,NumValue 属性是否会发生变化?在OnNumChanged方法中放一个断点,看看它是否被命中。
  • 谢谢!我发现了问题。修改btnUp和btnDown的点击事件修改NumValue后,效果很好。
【解决方案2】:

数字上/下控制已经开发出来了...不要浪费你的时间,你甚至可以抓住代码>https://github.com/xceedsoftware/wpftoolkit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2010-12-09
    相关资源
    最近更新 更多