代码之家  ›  专栏  ›  技术社区  ›  japf

如何在每次打开ContextMenu时强制执行绑定求值?

  •  4
  • japf  · 技术社区  · 16 年前

    我有一个带有菜单项的上下文菜单:

    <Grid>
        <Button Content="{Binding Test}">
            <Button.ContextMenu>
                <ContextMenu>
                    <StackPanel>
                        <MenuItem Header="{Binding Test}"/>
                    </StackPanel>
                </ContextMenu>
            </Button.ContextMenu>
        </Button>
    </Grid>
    

    测试属性如下所示:

    private Random rand;
    
    public string Test
    {
        get
        {
            return "Test " + this.rand.Next(50);
        }
    }
    

    当我右键单击按钮时,我有,例如“Test 41”。下一次打开菜单时,我有相同的值。是否有办法强制菜单每次评估绑定?(然后进行“测试3”、“测试45”、“测试65”。。。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Aran Mulholland JohnnyAce    16 年前

    命名上下文菜单并创建自己的RoutedCommand,我对所有按钮和菜单都使用这些命令,因为它们有一个CanExecute方法来启用或禁用控件,还有一个Execute方法被调用来完成工作。每次上下文菜单打开时,都会调用CanExecute方法。这意味着您可以进行自定义处理,查看是否应该启用它,或者您可以更改菜单的内容,这有助于在保存不同内容时更改菜单。我们用它来表示,保存xyx。。当用户编辑xyx时。

        2
  •  0
  •   Julien Poulin    16 年前

    你的 Test 属性需要在其值发生变化时通知其他组件,例如通过实现 INotifyPropertyChanged

    class Window1 : Window, INotifyPropertyChanged {
    
      ...
    
      private string m_Test;
    
      public string Test {
        get {
          return m_Test;
        }
        set {
          m_Test = value;
          OnPropertyChanged("Test");
        }
      }
    
    }
    

    然后可以修改的值 试验 从任何地方 使用属性 Test = "newValue"; )这些变化将反映在用户界面上。

    如果您确实需要在 ContextMenu 如图所示,请使用 Opend 上下文菜单 :

    Xaml:

    <ContextMenu Opened="UpdateTest">
      <MenuItem Header="{Binding Test}" />
    </ContextMenu>
    

    代码隐藏:

    private void UpdateTest(object sender, RoutedEventArgs e) {
      // just assign a new value to the property,
      // UI will be notified automatically
      Test = "Test " + this.rand.Next(50);
    }
    
    推荐文章