小编Jos*_*h G的帖子

刷新WPF命令

有谁知道我怎么可以强制CanExecute调用自定义命令(约什史密斯RelayCommand)?

通常,CanExecute只要在UI上发生交互,就会调用它.如果我点击某些内容,我的命令会更新.

我有一种情况,CanExecute即幕后的计时器打开/关闭条件.因为这不是由用户交互驱动的,CanExecute所以在用户与UI交互之前不会调用.最终结果是我的Button保持启用/禁用,直到用户点击它.点击后,它会正确更新.有时Button显示已启用,但是当用户单击它时,更改为禁用而不是触发.

当计时器更改影响的属性时,如何强制更新代码CanExecute?我对影响的属性尝试了kick PropertyChanged(INotifyPropertyChanged)CanExecute,但这没有帮助.

示例XAML:

<Button Content="Button" Command="{Binding Cmd}"/>
Run Code Online (Sandbox Code Playgroud)

后面的示例代码:

private ICommand m_cmd;
public ICommand Cmd
{
    if (m_cmd == null)
        m_cmd = new RelayCommand(
            (param) => Process(),
            (param) => EnableButton);

    return m_cmd;
}

// Gets updated from a timer (not direct user interaction)
public bool EnableButton { get; set; }
Run Code Online (Sandbox Code Playgroud)

wpf updating mvvm

69
推荐指数
4
解决办法
5万
查看次数

从ContextMenu中的MenuItem绑定ElementName

是否有人注意到带有ElementName的Bindings无法正确解析MenuItem对象中包含的ContextMenu对象?看看这个样本:

<Window x:Class="EmptyWPF.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    x:Name="window">
    <Grid x:Name="grid" Background="Wheat">
        <Grid.ContextMenu>
            <ContextMenu x:Name="menu">
                <MenuItem x:Name="menuItem" Header="Window" Tag="{Binding ElementName=window}" Click="MenuItem_Click"/>
                <MenuItem Header="Grid" Tag="{Binding ElementName=grid}" Click="MenuItem_Click"/>
                <MenuItem Header="Menu" Tag="{Binding ElementName=menu}" Click="MenuItem_Click"/>
                <MenuItem Header="Menu Item" Tag="{Binding ElementName=menuItem}" Click="MenuItem_Click"/>
            </ContextMenu>
        </Grid.ContextMenu>
        <Button Content="Menu" 
                HorizontalAlignment="Center" VerticalAlignment="Center" 
                Click="MenuItem_Click" Tag="{Binding ElementName=menu}"/>
        <Menu HorizontalAlignment="Center" VerticalAlignment="Bottom">
            <MenuItem x:Name="anotherMenuItem" Header="Window" Tag="{Binding ElementName=window}" Click="MenuItem_Click"/>
            <MenuItem Header="Grid" Tag="{Binding ElementName=grid}" Click="MenuItem_Click"/>
            <MenuItem Header="Menu" Tag="{Binding ElementName=menu}" Click="MenuItem_Click"/>
            <MenuItem Header="Menu Item" Tag="{Binding ElementName=anotherMenuItem}" Click="MenuItem_Click"/>
        </Menu>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

除了ContextMenu中包含的绑定之外,所有绑定都很有效.它们在运行时将错误输出到"输出"窗口.

有谁知道任何工作?这里发生了什么?

data-binding wpf contextmenu elementname

66
推荐指数
4
解决办法
3万
查看次数

防止双击双击命令

鉴于您有一个触发命令的控件:

<Button Command="New"/>
Run Code Online (Sandbox Code Playgroud)

如果用户双击命令,有没有办法阻止命令被触发两次?

编辑:在这种情况下重要的是我在WPF中使用命令模型.

看来按下按钮时,执行命令.除了禁用或隐藏按钮之外,我没有看到任何阻止这种情况的方法.

.net c# wpf double-click

13
推荐指数
8
解决办法
4万
查看次数

如何通过ConfigurationManager写入User.Config文件?

我正在尝试使用ConfigurationManager将用户设置保留到配置文件中.

我想将这些设置仅限于用户,因为没有管理员权限,无法在Vista/Win 7上保存应用程序更改.

这似乎得到了用户的配置,它似乎保存在Win 7中([Drive]:\ Users\[Username]\AppData\Local\[ApplicationName]\[AssemblyName] [hash]\[Version \]

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
Run Code Online (Sandbox Code Playgroud)

每当我尝试将任何更改保存到此配置时,我都会遇到以下异常:

InnerException: System.InvalidOperationException
Message="ConfigurationSection properties cannot be edited when locked."
Source="System.Configuration"
StackTrace:
    at System.Configuration.SectionInformation.VerifyIsEditable()
    at System.Configuration.MgmtConfigurationRecord.GetConfigDefinitionUpdates(Boolean requireUpdates, ConfigurationSaveMode saveMode, Boolean forceSaveAll, ConfigDefinitionUpdates& definitionUpdates, ArrayList& configSourceUpdates)
Run Code Online (Sandbox Code Playgroud)

我尝试将自定义ConfigurationSection添加到此配置中.我已经尝试添加到AppSettingsSection.每当我调用config.Save()它时抛出上面的异常.

有任何想法吗?

我尝试通过Project-> Settings设计器使用ApplicationSettingsBase类,但似乎不能保存自定义类型.我想要类似的功能,能够保存自定义类型.

.net c# settings configurationmanager configuration-files

11
推荐指数
1
解决办法
1万
查看次数

在Windows 8中获取类型程序集

我正在尝试在Windows 8中使用MEF.

为了构建我AssemblyCatalog的容器,我需要一个对程序集的引用.在过去,我会这样做:

var catalog = new AssemblyCatalog(typeof(App).Assembly);
Run Code Online (Sandbox Code Playgroud)

神秘地,物体Assembly不再存在于Type物体上.有人知道好的工作吗?有没有另一种方法来获得组装?我可以使用加载它Assembly.Load,但我需要程序集的名称.我不能从类型中得到那个.

使用DirectoryCatalog可能的备用?我不喜欢这个主意,但我会做我需要的.

c# mef windows-8 windows-runtime

10
推荐指数
2
解决办法
3953
查看次数

在React + Enzyme中模拟clientHeight和scrollHeight进行测试

我们有一个名为ScrollContainer的React组件,当它的内容滚动到底部时调用prop函数.

基本上:

componentDidMount() {
  const needsToScroll = this.container.clientHeight != this.container.scrollHeight

  const { handleUserDidScroll } = this.props

  if (needsToScroll) {
    this.container.addEventListener('scroll', this.handleScroll)
  } else {
    handleUserDidScroll()
  }
}

componentWillUnmount() {
  this.container.removeEventListener('scroll', this.handleScroll)
}

handleScroll() {
  const { handleUserDidScroll } = this.props
  const node = this.container
  if (node.scrollHeight == node.clientHeight + node.scrollTop) {
    handleUserDidScroll()
  }
}
Run Code Online (Sandbox Code Playgroud)

this.container 在render方法中设置如下:

<div ref={ container => this.container = container }>
  ...
</div>
Run Code Online (Sandbox Code Playgroud)

我想用Jest + Enzyme测试这个逻辑.

我需要一种方法来强制clientHeight,scrollHeight和scrollTop属性成为我为测试场景选择的值.

使用mount而不是浅,我可以获得这些值,但它们始终为0.我还没有找到任何方法将它们设置为非零值.我可以设置容器wrapper.instance().container = { scrollHeight: 0 }等等,但这只会修改测试上下文而不是实际组件.

任何建议,将不胜感激!

unit-testing reactjs jestjs enzyme

10
推荐指数
2
解决办法
3399
查看次数

DataContext更改时立即更新绑定

我试图在更改DataContext后立即测量对象,但对象的绑定不会很快得到更新.这是我的代码:

// In MeasureOverride(Size)
m_inputWidth = 0.0;

Size elemSize = new Size(double.PositiveInfinity, RowHeight);
MapElementView ruler = new MapElementView();

// Measure inputs
foreach (MapElementViewModel elem in m_vm.InputElements)
{
   ruler.DataContext = elem;
   ruler.Measure(elemSize);
   m_inputWidth = Math.Max(m_inputWidth, ruler.DesiredSize.Width);
}
Run Code Online (Sandbox Code Playgroud)

我希望View对象的绑定能够更新,以便我可以测量View显示ViewModel所需的大小.我正在重复使用相同的View进行测量,因为我正在虚拟化数据.

有谁知道如何在DataContext更改时强制绑定更新?

请注意,绑定最终会更新.

视图包含一个TextBlock,它是基于ViewModel更改大小的主要元素.我在更改DataContext后立即查看了此元素上的TextProperty的BindingExpression,但调用UpdateTarget()并不能解决问题,BindingExpression.DataItem似乎为null.

编辑:BindingExression的状态是Unattached.诀窍是弄清楚如何附加它.

.net c# data-binding wpf

9
推荐指数
1
解决办法
4902
查看次数

匿名类型的目的是什么?

匿名类型的最佳用例是什么?

在我看来,它们仅在有限的上下文中有用,例如一个类或一个函数.它们很难在这种情况之外使用,因为没有反射,没有人会知道这些类型可用的属性.

.net anonymous-types

7
推荐指数
1
解决办法
376
查看次数

选择多播IP地址

我无法理解多播地址的工作原理.

首先,如果我有N个客户端或同行在不同的网络上工作,它们都订阅了相同的组播组,并且该组允许任何源发送消息,这些对等体/主机都可以通过这个相互通信组?(听起来像黑魔法!)

其次,我听说过IANA控制/管理多播地址的提示.那么您是否需要请求/要求IANA为您的项目/公司提供特定的多播地址?这是如何运作的?我错了吗?你能为我澄清一下多播网络吗?

非常感谢!

networking p2p udp multicast iana

6
推荐指数
1
解决办法
1308
查看次数

使用逗号的F#let语句的语义

我正在学习F#.我首先查看了Microsoft 的F#示例.

我跑过这个声明:

let line1,line2 = 
    use sr = System.IO.File.OpenText @"test.txt"
    let line1 = sr.ReadLine() 
    let line2 = sr.ReadLine() 
    (line1,line2)
Run Code Online (Sandbox Code Playgroud)

谁能向我解释这个陈述?

这里定义的是什么类型?一个功能?一个元组?

为什么line1line2必须的定义范围内重新定义line1,line2(let line1 =... let line2 =)?

什么是最后一行,(line1, line2)这与原始定义的类型有什么关系?这是函数返回吗?

"声明"甚至是用于F#中定义的正确单词吗?

谢谢.

syntax f# tuples let semantics

5
推荐指数
1
解决办法
750
查看次数