首页 > 解决方案 > 显示时 WPF 按钮内容为空

问题描述

我是 C#/WPF 的新手。有一个定义了一个按钮的视图,当视图初始化时,按钮会显示一组从DataContext(视图模型)获取的原因代码,一旦点击任何按钮,上面的代码将被保存并传递给下一步处理。

Q:按钮上的文字完全是空的,但是点击的代码可以被捕获,那么问题出在哪里?谢谢。

XAML:

<Button x:Name="btnReason" Command="{Binding DataContext.SelectCommand, RelativeSource={RelativeSource AncestorType=v:View, Mode=FindAncestor}}" CommandParameter="{Binding}" Width="190" Height="190" >
    <Border Background="Transparent">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <TextBlock x:Name="Reason" Grid.Row="0" Text="{Binding ?????}" TextWrapping="Wrap" />
        </Grid>
    </Border>
</Button>

C#上的代码:

public class ReasonsViewModel : ViewModel
{
    private IEnumerable<string> m_Names;
    public IEnumerable<string> Names
    {
        get { return m_Names; }
        set
        {
            if (m_Names != value)
            {
                m_Names = value;
                OnPropertyChanged(() => Names);
            }
        }
    }

    private string m_SelectedName;
    public string SelectedName
    {
        get { return m_SelectedName; }
        set
        {
            if (m_SelectedName != value)
            {
                m_SelectedName = value;
                OnPropertyChanged(() => SelectedName);
            }
        }
    }

    public DelegateCommand SelectCommand { get; private set; }

    public ReasonsViewModel()
    {
        SelectCommand = new DelegateCommand(p => SelectCommandExecute(p));
    }

    private bool m_Processing;

    private void SelectCommandExecute(object item)
    {
        if (m_Processing) return;

        try
        {
            m_Processing = true;

            var name = item as string;
            if (name == null) return;

            SelectedName = name;
        }
        finally
        {
            m_Processing = false;
        }
    }
}

标签: c#wpf

解决方案


如果我正确地理解了您的问题,那么您的财产text应该TextBlock被绑定到SelectedName

问题是你CommandParameter的必然DataContext。这就是空{Binding}语句的界限。这意味着您的命令处理程序总是在空检查后返回。

我还建议您将您的Names财产从更改IEnumerable<string>ObservableCollection<string>
ObservableCollection 在内部的任何添加或删除项目时引发事件,并且 WPF 组件可以绑定到这些事件。


推荐阅读