【问题标题】:Can I swap a buttons content databind to a different databind in code?我可以将按钮内容数据绑定交换到代码中的不同数据绑定吗?
【发布时间】:2013-10-05 19:52:36
【问题描述】:

我找不到任何示例来让我了解如何以及是否可以通过单击按钮(在我的情况下为切换开关)更改 c# 中的数据绑定,基本上我的应用程序中有 32 个按钮,这 32 个按钮起作用相同,但需要不同的文本,具体取决于它们当前被数据绑定的一些切换开关,因此可以保存文本并从本地存储中检索文本,但它获得的值取决于这些切换开关的状态。

所以我目前有:

<Button x:Name="_ovButton1" Content="{Binding Source={StaticResource AppSettings}, Path=ovName1_1Value, Mode=TwoWay}" Margin="2,0,250,0" VerticalAlignment="Top" FontSize="14" Height="72" FontWeight="Bold" MouseLeftButtonUp="_ovButton1_MouseLeftButtonUp" MouseLeftButtonDown="_ovButton1_MouseLeftButtonDown" ClickMode="Hover" Hold="_ovButton1_Hold"/>

我想当用户改变一个切换开关的状态来改变

{StaticResource AppSettings}, Path=ovName1_1Value, Mode=TwoWay}

例如:

{StaticResource AppSettings}, Path=ovName1_2Value, Mode=TwoWay}

但我找不到任何示例说明如何在 c# 中执行此操作 我需要什么代码?

【问题讨论】:

  • 按钮是否根据文本执行不同的操作?换句话说,按钮 1 在单击时总是做“X”吗?或者当文本不同时它会做'Y'吗?
  • 不,让我澄清一下...这是总体目标:我有 32 个按钮,按下它们时的动作无论如何都是相同的,但我希望标签根据切换开关而改变已选中(一次只选择一个)ctwo12.com/fsr/fsr5.png 这样我就可以允许用户保存标签,以便他们知道他们在点击什么...正如您在屏幕截图中看到的那样,您有 6 个切换按钮和很多按钮想要在第一个按钮 button1 page1 上显示相同的按钮,那么当用户点击下一个切换按钮时, button1 page1 将变为 button1 page2... 这有意义吗?
  • 所以,32 个按钮,每个都执行不同的操作,但是按钮 1 总是会执行“X”,无论它显示什么文本?为什么文本总是改变'X'?
  • 所有 32 个按钮都需要通过控制 pc 软件上的 32 个按钮的套接字发送相同的内容,因此它们发送例如 buttonXX 软件会选择它并设置应用程序用户所在按钮的状态紧迫。 pc 软件上有 32 个按钮的 6 个标签页,拨动开关只发送代码来更改 TABS,否则例如按钮 1 将在 pc 软件所在的任何页面上更改 button1 ......所以目前一切正常很好......现在这个控制的是夜总会照明
  • 你需要给按钮贴上标签,这样你就知道你在做什么了它在更改时会保存,但我需要让这些按钮根据您使用切换开关选择的页​​面来检索不同的标签,这样人们就可以标记他们的按钮,以便他们知道他们正在点击什么,这有帮助吗?

标签: c# data-binding windows-phone-8


【解决方案1】:

您可以像这样在代码中指定数据绑定的目标:

MyData myDataObject = new MyData(DateTime.Now);      
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
myText.SetBinding(TextBlock.TextProperty, myBinding);

http://msdn.microsoft.com/en-us/library/ms742863.aspx查看更多信息

【讨论】:

  • 我已经看到了,但是在我上面的 xaml 代码中(我知道我对此感到非常愚蠢)但是你在该代码的哪个部分放置了路径部分并且资源部分是?
【解决方案2】:

-- 编辑说明我无权访问 WP8 模拟器来测试这个 ---

在视图模型中是这样的:

public List<string> Members 
{ 
    get { return _Members; }
    set { _Members = value; OnPropertyChanged(); } 
}
public MainVM()
{
    // Simulate Asychronous access, such as to a db.

    Task.Run(() =>
                {
                    Thread.Sleep(2000);
                    Members = new List<string>() {"Alpha", "Beta", "Gamma", "Omega"};
                });
}

主页后面的代码将数据上下文(与所有子控件共享)设置为:

public MainWindow()
{
    InitializeComponent();

    // Set the windows data context so all controls can have it.
    DataContext = new MainVM();

}

要绑定成员的Mainpage Xaml是这样的

<Button Height="30"
        Width="80"
        Margin="10"
        DataContext="{Binding Members}"
        Content="{Binding Path=[0] }" />

<Button Height="30"
        Width="80"
        Margin="10"
        DataContext="{Binding Members}"
        Content="{Binding Path=[1] }"  />

<Button Height="30"
        Width="80"
        Margin="10"
        DataContext="{Binding Members}"
        Content="{Binding Path=[2] }"  />

<Button Height="30"
        Width="80"
        Margin="10"
        DataContext="{Binding Members}"
        Content="{Binding Path=[3] }"  />

结果在视觉上是这样的:

我基于我的博客文章 Xaml:ViewModel Main Page Instantiation and Loading Strategy for Easier Binding 了解更多信息和更完整的示例。

【讨论】:

    【解决方案3】:

    我认为您最好的选择是使用字符串集合并绑定到该集合。您可以在切换切换时更改集合,或者保留 6 个集合并绑定到用于切换的集合。

    Xaml:

    <ItemsControl x:Name="Buttons" ItemsSource="{Binding ButtonTextCollection}">
        <ItemsControl.ItemsPanel>
            <toolkit:WrapPanel/>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Width="100" Height="70" Content="{Binding}" Click="OnButtonClick"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    您的代码隐藏将为您的按钮单击提供事件处理程序

    private void OnButtonClick(object sender, RoutedEventArgs e)
    {
        var text = ((Button) sender).Content.ToString();
        // Send the text
    }
    

    您的 ViewModel 将持有 ButtonTextCollection 属性,并会根据切换进行更改。

    public ICollection<string> ButtonTextCollection
    {
        get { return _buttonTextCollection; }
        set
        {
            _buttonTextCollection = value;
            OnPropertyChanged("ButtonTextCollection");
        }
    }
    

    当你想改变文字时,你可以改变ButtonTextCollection

    public void ChangeButtonText()
    {
        ButtonTextCollection = new Collection<string> {"A", "B",...};
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多