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

按另一个文本框的文本弹出文本块中的值

  •  -1
  • Bigeyes  · 技术社区  · 7 年前

    我在视图中有一个文本框。如果我在文本框a中输入一个值,则文本块B的值将自动显示。这两个属性之间的关系在我的ViewModel的字典中定义。

    Dictionary<string,string> dict = LoadFromDb();
    // dict["01"] = "USA";
    // dict["02"] = "ENG";
    // If I input 01 in code textbox, then the country textblockwill display USA.
    

    文本框和文本块位于celltemplate中。让我给你举个例子。

     <telerik:RadGridView Name="radGridView1" ShowGroupPanel="False" ShowGroupFooters="False" AutoGenerateColumns="False" ItemsSource="{Binding Persons}">
     <telerik:RadGridView.Columns>
     <telerik:GridViewDataColumn Header="Code" DataMemberBinding="{Binding Code}">
         <telerik:GridViewDataColumn.CellTemplate>
           <DataTemplate>
               <StackPanel Orientation="Horizontal">
                  <TextBox Text="{Binding Code}" />
               </StackPanel>
           </DataTemplate>
       </telerik:GridViewDataColumn.CellTemplate>
    </telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn Header="Country" DataMemberBinding="{Binding Country}">
         <telerik:GridViewDataColumn.CellTemplate>
           <DataTemplate>
               <StackPanel Orientation="Horizontal">
                  <TextBlock Text="{Binding Country}" />
               </StackPanel>
           </DataTemplate>
       </telerik:GridViewDataColumn.CellTemplate>
    </telerik:GridViewDataColumn>
    </telerik:RadGridView.GridViewDataColumns>
    

    我不能在我的模型类中绑定它们,因为模型类没有字典的信息。

    那么最好的方法是什么呢?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Rekshino    7 年前

    将Country列绑定到整个数据条目,并使用converter显示只读值:如果它来自DB,则未修改,否则从dictionary获取。

    <Window.Resources>
        <local:ValueConverter x:Key="convResName"/>
    </Window.Resources>
    ...
    <telerik:GridViewDataColumn Header="Country" DataMemberBinding="{Binding}">
         <telerik:GridViewDataColumn.CellTemplate>
           <DataTemplate>
               <StackPanel Orientation="Horizontal">
                  <TextBlock Text="{Binding Converter={StaticResource convResName}, ConverterParameter={StaticResource {x:Static local:YourViewModel.yourDictAsStaticProperty}}}" />
               </StackPanel>
           </DataTemplate>
       </telerik:GridViewDataColumn.CellTemplate>
    </telerik:GridViewDataColumn>
    
    public class ValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var person = value as Person;
            if (person==null)
            {
                return null;
            }
            var dict = parameter as Dictionary<string, string>;
            if (string.IsNullOrWhiteSpace(person.Country))
            {
                try
                {
                    person.Country = dict[person.Code];
                }
                catch (KeyNotFoundException exc)
                {
                    //handle exc
                }
            }
            return person.Country;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }