【问题标题】:Binding in C# and XAML errorC# 和 XAML 中的绑定错误
【发布时间】:2015-02-13 20:25:21
【问题描述】:

我有以下代码,我应该在按钮的content 中放置一个随机数。但是每次按钮的内容都是相同的值0- 这是我的C# 代码的一部分-

public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            this.DataContext = this;
            this.NavigationCacheMode = NavigationCacheMode.Required;
        }
        public int RandomNumber { get; set; }
        public int GenerateRandomNumber(int min, int max)
        {
            Random random = new Random();
            return random.Next(5,40);
        }

  private void ButtonNo3(object sender, RoutedEventArgs e)
    {
        int ans = 0;
        Button obj = (Button)sender;
        var selectedButton = obj.Content.ToString(); 
        //some more code
    }

这是我的XAML 代码的一部分,其中我的按钮的内容中应该有一个随机数-

            <Button 
            x:Name="Button3"
            Content="{Binding Path=RandomNumber}"                           
            Click="ButtonNo3"
            HorizontalAlignment="Left" 
            Margin="0,118,0,0" 
            VerticalAlignment="Top" 
            Height="37" 
            Width="47"/>

所以我的问题是为什么Button3Content 总是0 应该是随机的。

【问题讨论】:

    标签: c# wpf xaml visual-studio-2012 visual-studio-2013


    【解决方案1】:

    您没有在任何地方调用 GenerateRandomNumber 函数(至少在所示代码中没有),因此 RandomNumber 属性将始终具有默认值 0。

    【讨论】:

    • 更多,他没有将RandomNumber设置为GenerateRandomNumber的返回值。
    【解决方案2】:

    以下应该可以解决问题

    public sealed partial class MainPage : Page,INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private int __RandomNumber;
    
        public MainPage()
        {
            this.InitializeComponent();
            this.DataContext = this;
            this.NavigationCacheMode = NavigationCacheMode.Required;
        }
        public int RandomNumber 
        { 
            get{return _RandomNumber} 
            set
            {
                if (_RandomNumber != value){
                  _RandomNumber = value;
                  this.OnPropertyChanged("RandomNumber");//needed for binding
                }
            }; 
        }
        public int GenerateRandomNumber(int min, int max)
        {
            Random random = new Random();
            RandomNumber = random.Next(5,40); //changed this line, do the assign
            return RandomNumber;
        }
    
        private void ButtonNo3(object sender, RoutedEventArgs e)
        {
            int ans = 0;
            Button obj = (Button)sender;
            var selectedButton = obj.Content.ToString(); 
            //some more code
            GenerateRandomNumber(0,0);  //added : generate a random number
        }
    

    我用这段代码解决了多个问题。 您永远不会生成随机数,也不会分配它。 您没有实现 inotifypropertychanged,因此即使您是生成一个新号码,它也不会被绑定拾取。上面的代码没有经过测试,可能还有一些问题,但是应该可以给你一个思路。

    【讨论】:

    • 您可能应该避免在每次方法调用时创建Random 类的新实例,尤其是在“随机”数字的生成有可能很快被调用的情况下。 (默认的Random 构造函数由系统时钟播种,并且可能导致相同的“随机”数字。)更好的解决方案是创建一个类级别的实例,并调用Next(lower, max) 方法。欲了解更多信息here's the MSDN article。查看Remarks 部分以获取有关默认构造函数问题的信息。
    • 缺少 INotifyPropertyChanged 的​​实现。我加了。
    • @Cameron 我有很多按钮,它们都得到相同的随机值。我想你是在警告我,但我无法修复它。
    【解决方案3】:

    如前所述,您不会在任何地方调用 GenerateRandomNumber 方法。需要将按钮的 content 属性设置为随机数方法返回的值。

    要每次获取不同的值,请在单击事件中设置 selectedButton 变量之前输入此代码。

    obj.Content = GenerateRandomNumber(5,40);
    var selectedButton = obj.Content;
    

    在另一个注意事项上。 GenerateRandomNumber 方法的参数是无用的。你没有使用它们。你应该这样做:

    private int GenerateRandonNumber( int min, int max ) {
        Random random = new Random();
        return random.Next( min, max );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多